我试图通过使用变量类名访问类中的静态变量.我知道为了访问类中的函数,您使用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实例有更好(更优雅)的方式.几句评论后我也编辑了这段代码(和我的答案).我添加了受保护变量的示例(当然,您无法从类外部访问它们,因此我创建了静态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
您可以使用反射来执行此操作.给定classname 创建一个ReflectionClass对象,然后使用getStaticPropertyValue方法获取静态变量值.
class Demo { public static $foo = 42; } $class = new ReflectionClass('Demo'); $value=$class->getStaticPropertyValue('foo'); var_dump($value);
要调用静态成员,您可以使用如下代码:
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'];