2009-03-23 8 views
25

J'essaie d'accéder à une variable statique dans une classe en utilisant un nom de classe variable. Je suis conscient que, pour accéder à une fonction au sein de la classe, vous utilisez call_user_func():

class foo { 
    function bar() { echo 'hi'; } 
} 
$class = 'foo'; 
call_user_func(array($class, 'bar')); // prints hi 

Cependant, cela ne fonctionne pas lorsque vous essayez d'accéder à une variable de statique dans la classe:

class foo { 
    public static $bar = 'hi'; 
} 
$class = "foo"; 
call_user_func(array($class, 'bar')); // nothing 
echo $foo::$bar; // invalid 

Comment obtenir cette variable? Est-ce même possible? J'ai un mauvais pressentiment c'est seulement disponible dans PHP 5.3 et j'utilise PHP 5.2.6.

+0

@Krinkle, s'il vous plaît ne prenez pas l'habitude d'ajouter gras au texte - il ne aide pas presque autant de choses que beaucoup de gens. Merci! – sarnold

Répondre

24

Vous pouvez utiliser reflection pour faire ça. Créez un objet ReflectionClass avec le nom de classe, puis utilisez la méthode getStaticPropertyValue pour obtenir la valeur de la variable statique.

class Demo 
{ 
    public static $foo = 42; 
} 

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

J'ai remarqué que getStaticPropertyValue ($ prop) ne semble pas fonctionner si $ prop est autre chose que "public static". Il sera bork si $ prop est déclaré "private static" ou "protected static" dans la classe. Je ne suis pas exactement sûr pourquoi, cependant. – brianjcohen

+10

Cela a du sens, car si ce n'est pas public, vous ne devriez pas avoir accès à l'extérieur de la classe. – adudley

21

Pour appeler des membres statiques, vous pouvez utiliser un code comme ceci:

call_user_func("MyClass::my_static_method"); 
// or 
call_user_func(array("MyClass", "my_static_method")); 

Malheureusement, la seule façon d'obtenir des membres statiques d'un objet semble être get_class_vars():

$vars = get_class_vars("MyClass"); 
$vars['my_static_attribute']; 
24

Je pense qu'il y a beaucoup mieux (plus élégant) alors en créant l'instance de ReflectionClass. J'ai également édité ce code (et ma réponse) après quelques commentaires. J'ai ajouté un exemple pour les variables protégées (vous ne pouvez évidemment pas y accéder depuis l'extérieur de la classe, donc j'ai créé un getter statique et je l'ai appelé en utilisant un pattern variable). Vous pouvez l'utiliser dans différentes façons:

class Demo 
{ 
    public static $foo = 42; 
    protected static $boo = 43; 
    public static function getProtected($name) { 
     return self::$$name; 
    } 
} 

$var1 = 'foo'; 
$var2 = 'boo'; 
$class = 'Demo'; 
$func = 'getProtected'; 
var_dump(Demo::$$var1); 
var_dump($class::$foo); 
var_dump($class::$$var1); 
//var_dump(Demo::$$var2); // Fatal error: Cannot access protected property Demo::$boo 
var_dump(Demo::getProtected($var2)); 
var_dump($class::getProtected($var2)); 
var_dump($class::$func($var2)); 

Documentation est ici:

http://php.net/manual/en/language.variables.variable.php

+1

Je ne pensais pas que cela fonctionnerait si 'Demo' était une variable ... mais ça fonctionne:' $ class :: $$ field' – mpen

+0

ouais, c'est le cas. J'ai oublié de l'écrire - merci! – Karol

+1

'$ class :: $$ field' ne fonctionne que si vous utilisez PHP 5.3 ou supérieur, semble-t-il. – jamietelin

2

Avez-vous essayer?

class foo { 
    static public $bar = "Hi"; 

    static public function bar() { 
     echo "Hi"; 
    } 
} 

echo foo::$bar; // Output: Hi 
foo::bar(); // Output: Hi 

$class = "foo"; 
echo $class::$bar; // Output: Hi 
$class::bar(); // Output: Hi 
call_user_func($class, 'bar'); // Output: Hi 
+2

La question a 4 ans et se réfère explicitement à une ancienne version de PHP où '$ class: : $ bar' n'était pas encore possible. –

Questions connexes