Доступ к статической переменной по переменной $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.
Ответы
Ответ 1
Вы можете использовать reflection для этого. Создайте объект ReflectionClass с учетом имени класса, а затем используйте метод getStaticPropertyValue для получения значения статической переменной.
class Demo
{
public static $foo = 42;
}
$class = new ReflectionClass('Demo');
$value=$class->getStaticPropertyValue('foo');
var_dump($value);
Ответ 2
Я думаю, что есть намного лучший (более элегантный) способ создания экземпляра 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
Ответ 3
Для вызова статических членов вы можете использовать такой код:
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'];
Ответ 4
Попробуйте это?
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