通过 $var::$reference 访问静态变量

php
2022-08-30 14:45:22

我正在尝试使用变量类名访问类中的静态变量。我知道为了访问类中的函数,您可以使用: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

我认为有比创建ReflectiveClass实例更好(更优雅)的方法。在几条评论之后,我还编辑了这个代码(和我的答案)。我为受保护的变量添加了示例(当然,您不能从类外部访问它们,因此我制作了静态 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


答案 2

您可以使用反射来执行此操作。创建给定类名的 ReflectionClass 对象,然后使用 getStaticPropertyValue 方法获取静态变量值。

class Demo
{
    public static $foo = 42;
}

$class = new ReflectionClass('Demo');
$value=$class->getStaticPropertyValue('foo');
var_dump($value);

推荐