当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《通过$var::$reference访问静态变量》经验,为你挑选了3个好方法。

我试图通过使用变量类名访问类中的静态变量.我知道为了访问类中的函数,您使用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> Karol..:

我认为创建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


`$ class :: $$ field`仅在使用PHP 5.3或更高版本时才有效.

2> Paul Dixon..:

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

class Demo
{
    public static $foo = 42;
}

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


这是有道理的,因为它不公开,你不应该从课外访问它.

3> Armin Ronach..:

要调用静态成员,您可以使用如下代码:

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'];

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有