2012-12-20 12 views
6

Sono nuovo di PHP e pratico utilizzando variabili statiche. Ho deciso di prendere un esempio che ho imparato dal C++ e di riscriverlo per PHP (esempio dal basso di this article).Assegnazione var statica a var non statica, metodo per restituire valori non funzionanti

C'è una classe con due variabili private (una statica), una funzione di costruzione e un metodo get. Il costruttore assegna il valore della variabile statica alla seconda variabile privata e quindi incrementa.

<?php 
class Something 
{ 
    private static $s_nIDGenerator = 1; 
    private $m_nID; 

    public function Something() { 
     $m_nID = self::$s_nIDGenerator++; 
     echo "m_nID: " . $m_nID . "</br>"; //for testing, can comment this out 
    } 
    public function GetID() { 
     return $m_nID; 
    } 

} 

// extra question: 
// static variable can be assigned a value outside the class in C++, why not in PHP? 
// Something::$s_nIDGenerator = 1; 

    $cFirst = new Something(); 
    $cSecond = new Something(); 
    $cThird = new Something(); 

    echo $cFirst->GetID() . "</br>"; 
    echo $cSecond->GetID() . "</br>"; 
    echo $cThird->GetID() . "</br>"; 
?> 

Utilizzando il test eco in linea 9 per vedere se m_nID è sempre un valore che vedo:

m_nID: 1 
m_nID: 2 
m_nID: 3 

Ma questi valori sono non essere restituito dal "-> getId()" chiamate. Tutte le idee perché?

Modifica: entrambe le risposte finora hanno risolto questo, vorrei poterle "controllare" entrambe, quindi grazie! Lascerò il codice originale nella domanda così com'è per qualsiasi futura persona che ha un problema simile

risposta

9

Lo sfondo in C++ ha portato a questo problema, che è un errore facile da fare. In PHP, tutte le variabili di istanza (o oggetto) sono referenziate usando $this-> e le variabili statiche (o di classe) con self::. Sulla base di codice:

public function GetID() { 
    return $m_nID; 
} 

L'accesso alla variabile privata $m_nID dovrebbe essere ambito come questo:

public function GetID() { 
    return $this->m_nID; 
} 

E dentro il vostro costruttore:

$m_nID = self::$s_nIDGenerator++; 

Avrebbe dovuto essere:

$this->m_nID = self::$s_nIDGenerator++; 

Q & Un

Perché non c'è bisogno di mettere $ prima di m_nID quando si utilizza $this->

Quanto sopra due modi di riferimento delle istanze di classe e le variabili sono dotati di un tipo molto diverso di sintassi:

  1. $this è la variabile di riferimento dell'istanza e tutte le proprietà sono acc essed utilizzando l'operatore ->; lo $ non viene ripetuto per i nomi di proprietà, sebbene siano presenti nella dichiarazione (ad esempio private $myprop).

  2. self:: è uguale a Something:: (il nome classe stesso); non fa riferimento a una variabile di istanza e pertanto non ha $ di fronte. Per differenziare le variabili statiche dalle costanti di classe (self::MYCONST) e i metodi di classe (self::myMethod()) è preceduto da uno $.

Extra

Detto questo, $this->$myvar è accettato troppo e funziona così:

private $foo = 'hello world'; 

function test() 
{ 
    $myvar = 'foo'; 
    echo $this->$foo; // echoes 'hello world' 
} 
+0

@tempe Ugh, ho dimenticato che anche l'altro riferimento era errato = ( –

+0

Ho controllato la risposta di cui sopra da Mr. Cook, dove mi suggerì di usare $ this-> 'nel costruttore e anche il metodo get, che funzionava --- ma grazie per il vostro aiuto troppo! e sì, mentre io sono a conoscenza di 'this' in C++, trovo sto bisogno di usare più di apprendimento PHP – tempcode

+0

@tempe Sì, è nella mia risposta aggiornato sotto ** Aggiornamento . ** –

2
class Something{ 
    private static $s_nIDGenerator = 1; 
    private $m_nID; 

    public function Something() { 
     $this->m_nID = self::$s_nIDGenerator++; 
    } 
    public function GetID() { 
     return $this->m_nID; 
    } 

} 

E 'interessante notare la differenza tra l'utilizzo self::$s_nIDGenerator su una variabile statica vs utilizzando $this->s_nIDGenerator su una variabile statica, mentre $this-> non memorizza nulla.

+0

grazie per la tua risposta, tuttavia usando '$ this->' genera un errore che dice: 'Impossibile accedere alla proprietà vuota' --- che sembra implicare che '$ m_nID' è vuoto, quando so che non dovrebbe essere (come mostrato nel mio test di eco sulla linea 9) – tempcode

+0

quale linea sta dicendo "Impossibile accedere proprietà vuota", ho appena testato e non ha ricevuto errori. –

+0

ahhh Nevermind ho tenuto per sbaglio il "$" a fianco sia di m_nID (vale a dire '$ this -> $ m_nID'), che ha causato un errore di apparire, utilizzando il codice ha funzionato - grazie! – tempcode