Я пытаюсь получить доступ к статической переменной в классе, используя имя класса переменной. Я знаю, что для доступа к функции внутри класса вы используете 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.
Вы можете использовать отражение, чтобы сделать это. Создайте объект 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));
Документация находится здесь:
Для вызова статических членов вы можете использовать такой код:
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