2012-08-23 22 views
5

ho una domanda per quanto riguarda "dinamico" di classe inizializzazione, lascia che ti spieghi cosa intendo:

$class = 'User'; 
$user = new $class(); 

//...is the same as doing 
$user = new User(); 

Quindi ... non è questo il problema, ma sto avendo qualche problema fare lo stesso durante la chiamata una variabile statica da una classe, ad esempio:

$class = 'User'; 
print $class::$name; 

che dà il seguente errore:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in

Fuori rotta Ho provato a fare print User::$name; e questo funziona. Quindi lavori di classe.

Perché è questo e c'è un modo per aggirarlo?

Follow-up domanda:
Inoltre c'è qualche valide ragioni non utilizzare questo modo "dinamico" nella creazione di classi?

+0

non è possibile combinare chiamate dinamiche e statiche, motivo per cui è impossibile chiamare User :: $$ prop e anche il nome $ class :: $ –

+0

http://stackoverflow.com/questions/3679717/unexpected-t -paamayim-nekudotayim-on-one-computer-but-not-another-with-php-5 –

+1

possibile duplicato di [Accesso a una variabile statica di $ var :: $ reference] (http://stackoverflow.com/questions/ 675676/access-a-static-variable-by-varreference) –

risposta

1

Se non hanno la versione di PHP di 5.3 e sopra, e non si vuole usare la reflection (che a mio parere è un overkill - a meno che non si voglia accedere a più proprietà statiche) è possibile definire la funzione getter e chiamarla tramite call_user_func():

class A { 
    public static $var = "Hello"; 
    public static function getVar() { 
     return self::$var; 
    } 
} 
$className = "A"; 
echo call_user_func(array($className, 'getVar')); 
+0

Beh, questo è certamente un lavoro attorno al problema ... Grazie! – jamietelin

+0

Sembra soluzione ancora più semplice; '$ vars = get_class_vars ($ className);' – jamietelin

2

Questo codice funziona bene su PHP 5.4.3:

<?php 

class A { 
    public static $var = "Hello"; 
} 

print(A::$var); 

$className = "A"; 
print($className::$var); 

?> 
+2

Funziona anche in 5.3.2 –

+2

Questo è il codice che l'OP ha. Presumibilmente (anche se non ha dichiarato) deve usare una versione precedente di PHP. –

+1

Bene, allora so che è la mia versione PHP che è il problema. :) Grazie! – jamietelin

2

Questa è la risposta dalla questione ho linkato nei commenti:

You can use reflection to do this. Create a ReflectionClass object given the classname, and then use the getStaticPropertyValue method to get the static variable value.

class Demo 
{ 
    public static $foo = 42; 
} 

$class = new ReflectionClass('Demo'); 
$value=$class->getStaticPropertyValue('foo'); 
var_dump($value); 
+0

utilizzando reflection sembra essere una soluzione di overkill a meno che non si intenda usarlo su un gran numero di proprietà di classi statiche, ma si, usando reflection si ottiene il risultato necessario –

+1

Inoltre, viene emesso dal messaggio di errore che OP sta usando una versione di php prima di qualsiasi versione (5.3.qualcosa) che abbia il supporto adeguato per le classi statiche e le variabili di classe statiche e come tale potrebbe essere l'opzione migliore. –

+0

Quali sono le reali differenze qui dalla semplice creazione della classe "reale" e quindi dalla mia variabile? Come: '$ user = new $ class(); stampa $ utente-> nome; '? C'è un guadagno in termini di prestazioni dall'uso di Reflection? – jamietelin

Problemi correlati