2013-02-18 12 views
6

Ho due frammenti di codice (relativi alla parola chiave static) che mi aspetto abbiano lo stesso output, ma in realtà le uscite sono diverse.proprietà statiche php

La domanda è: perché?

frammento 1

class base 
{ 
    public static $var = 1; 
} 

class sub extends base 
{ 
    public static $var = 2; 
} 

echo base::$var; // Outputs 1 

frammento 2

class base2 
{ 
    public static $var2 = 1; 
} 

class sub2 extends base2 
{ 
} 

sub2::$var2 = 2; 
echo base2::$var2; // Outputs 2 
+0

grazie per il suggerimento, appena aggiornato – nut

+0

Ho il sospetto che si sta confondendo il risultato con 'const'. In php 'static' definisce una proprietà che è indipendente da un'istanza. Ma può ancora cambiare. – datasage

+0

@ user1970939, cosa stai effettivamente cercando di realizzare? L'output è diverso perché hai rimosso 'public static $ var = 2;'. Ma tu lo sai. Quindi qual è la vera domanda? – Matthew

risposta

11

Vorrei aggiungere un altro punto ad esso.

variabile STATICA sono non associato a una particolare istanza/oggetto di una classe. Quindi si modifica la variabile con riferimento alla classe padre o riferimento alla classe figlio, la stessa copia viene modificata.

Quindi, a parte la comprensione statica pubblica come globale, la prego di non associarla a nessuna particolare istanza, quindi con qualsiasi riferimento alla gerarchia di classi si aggiorna una variabile statica, la stessa posizione di memoria viene aggiornata.

-

Vinod

+0

così come per la spiegazione se cambio il valore della var in classe sub del primo codice come questo sub: $ var = 3; aggiornerà il valore di var nella classe base? – zamil

+0

Sì, è vero. Provalo. –

+0

no, no: class base { public static $ var = 1; } classe sub estende base { statico pubblico $ var = 2; } sub: $ var = 3; echo base :: $ var; echo sub :: $ var; per favore prova questo – zamil

7

Public static variable variabile come global variabile.

Come la portata della public static variable si trova a livello globale, è possibile garantire che eventuali modifiche al global variable può essere visto in tutto il concetto di program.This, è possibile analizzare nel vostro programma di esempio ....

Si prega di avere sguardo Static variable inheritance.

+0

grazie per il suggerimento – nut

+0

Siete i benvenuti .... Ma non consiglierei di usare variabili statiche ... –

+1

@downvoter: attenzione al commento ??? –

0

Poiché la classe sub2 non ha var2, prende il valore della classe base2. Quando si è assegnato un nuovo valore utilizzando questo sub2::$var2 = 2;, esso è stato modificato in nuovo valore.

Nel primo codice si è sovrascritto quello nella classe estesa. Le variabili hanno scope all'interno delle rispettive classi.

+0

È sbagliato, non vi è alcun concetto di superare le variabili/metodi statici. È solo la stessa memoria condivisa. Si prega di fare riferimento al mio commento –

+0

, possiamo sicuramente sovrascrivere i metodi statici. Ma non sono sicuro delle proprietà statiche, ma se dichiarate la stessa variabile della classe genitore in una classe estesa non puntano alla stessa locazione di memoria. – zamil

+0

Concordato, si prega di vedere i miei commenti alla tua domanda precedente nella mia risposta –

0

Se si passa una variabile statica a una sottoclasse, allora questa variabile è condivisa (che ha sempre lo stesso valore in entrambe le classi). Se si sovrascrive la variabile statica in una sottoclasse, allora si tratta di una nuova variabile statica indipendente dalla variabile statica del genitore.

In Snippet 1base::var e sub::var hanno diverse allocazioni di memoria, in quanto è stata definita $var = 2; nella classe sub.

In Snippet 2base::var e sub::var hanno la stessa allocazione della memoria, perché non è stato specificato $var2 nella classe sub2.

Ecco perché base:var non sta cambiando. Sarebbe anche non cambia se si cambia $var da sub classe più avanti in questo modo:

class base 
{ 
    public static $var = 1; 
} 

class sub extends base 
{ 
    public static $var = 2; 
} 
sub::var = 3 
echo base::var; // Outputs 1 
Problemi correlati