2011-02-20 9 views
14

Sto tentando di accedere a un metodo statico, ma utilizzando una variabile come nome della classe. È possibile? Mi sembra di avere problemi con esso. Voglio essere in grado di fare qualcosa del genere:accesso ai metodi statici che utilizzano un nome di classe variabile (PHP)

class foo { 
    public static function bar() { 
     echo 'test'; 
    } 
} 

$variable_class_name = 'foo'; 
$variable_class_name::bar(); 

E io voglio essere in grado di fare le variabili statiche che utilizzano simili pure.

+1

questo funziona bene per me su PHP 5.3.2. –

+0

utilizzando 5.2 credo. ottieni un errore come "Errore Parse: errore di sintassi, T_PAAMAYIM_NEKUDOTAYIM inatteso in /some/path/application/models/lev_base_model.php sulla riga 35" – dqhendricks

+0

Quale versione di PHP stai usando? Per quanto ne so, sei stato in grado di farlo nelle versioni recenti (5.2+, anche se non esattamente sicuro da quando questo sarebbe valido) – GordonM

risposta

17

Questa sintassi è supportata solo in PHP 5.3 e versioni successive. Le versioni precedenti non comprendono la sintassi, quindi il tuo errore di analisi (T_PAAMAYIM_NEKUDOTAYIM si riferisce all'operatore ::).

Nelle versioni precedenti si può provare call_user_func(), passandogli un array contenente il nome della classe e il suo nome del metodo:

$variable_class_name = 'foo'; 
call_user_func(array($variable_class_name, 'bar')); 
+0

giusto ... quindi c'è una soluzione? – dqhendricks

+0

@dqhendricks: vedere la mia modifica – BoltClock

+0

sembra eccezionale. C'è qualcosa di simile per le proprietà statiche? – dqhendricks

7

È possibile utilizzare reflection per PHP 5.1 e superiori:

class foo { 
    public static $bar = 'foobar'; 
} 

$class = 'foo'; 
$reflector = new ReflectionClass($class); 
echo $reflector->getStaticPropertyValue('bar'); 

> foobar 
+0

+1 Bello, mi piacerebbe pulire dimenticato di riflessione. – BoltClock

Problemi correlati