我试图通过使用变量类名来访问类中的静态变量。我知道为了访问班级中的函数,您可以使用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。
答案 0 :(得分:30)
我认为创建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));
文档在这里:
答案 1 :(得分:26)
您可以使用reflection执行此操作。给定classname创建一个ReflectionClass对象,然后使用getStaticPropertyValue方法获取静态变量值。
class Demo
{
public static $foo = 42;
}
$class = new ReflectionClass('Demo');
$value=$class->getStaticPropertyValue('foo');
var_dump($value);
答案 2 :(得分:21)
对于调用静态成员,您可以使用如下代码:
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'];
答案 3 :(得分:2)
你试试这个吗?
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