Доступ к статической переменной по переменной $ var :: $

Я пытаюсь получить доступ к статической переменной в классе, используя имя класса переменной. Я знаю, что для доступа к функции внутри класса вы используете call_user_func() :

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

Однако это не работает при попытке доступа к статической переменной внутри класса:

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

Как мне получить эту переменную? Возможно ли это? У меня плохое чувство, что это доступно только в PHP 5.3, и я запускаю PHP 5.2.6.

Solutions Collecting From Web of "Доступ к статической переменной по переменной $ var :: $"

Вы можете использовать отражение, чтобы сделать это. Создайте объект ReflectionClass с именем класса, а затем используйте метод getStaticPropertyValue для получения значения статической переменной.

 class Demo { public static $foo = 42; } $class = new ReflectionClass('Demo'); $value=$class->getStaticPropertyValue('foo'); var_dump($value); 

Я думаю, что есть намного лучший (более элегантный) способ создания экземпляра ReflectionClass. Я также редактировал этот код (и мой ответ) после нескольких комментариев. Я добавил пример для защищенных переменных (вы, конечно же, не можете получить доступ к ним извне класса, поэтому я сделал статический getter и вызвал его, используя шаблон переменной). Вы можете использовать его несколькими способами:

 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)); 

Документация находится здесь:

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

Для вызова статических членов вы можете использовать такой код:

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

К сожалению, единственный способ получить статические члены из объекта – get_class_vars() :

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

Вы пробовали это?

 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