【问题标题】:Access a static variable by $var::$reference通过 $var::$reference 访问静态变量
【发布时间】:2010-10-15 02:39:15
【问题描述】:

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

【问题讨论】:

  • @Krinkle,请不要养成在文本中添加粗体的习惯——它对很多人的帮助几乎没有。谢谢!

标签: php


【解决方案1】:

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

class Demo
{
    public static $foo = 42;
}

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

【讨论】:

  • 我注意到如果 $prop 不是“公共静态”,getStaticPropertyValue($prop) 似乎不起作用。如果在类中将 $prop 声明为“私有静态”或“受保护的静态”,它将失败。不过,我不确定为什么。
  • 这是有道理的,因为如果它不是公开的,你就不应该从课堂外访问它。
【解决方案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

【讨论】:

  • 这个问题已经有 4 年历史了,并且明确提到了一个旧的 PHP 版本,其中 $class::$bar 尚不可能。
【解决方案3】:

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

【讨论】:

  • 如果Demo 是一个变量,我认为这不会起作用……但确实如此。:$class::$$field
  • $class::$$field 似乎只有在您使用 PHP 5.3 或更高版本时才有效。
  • 我想知道是否有一种方法可以使受保护的变量起作用?如果可以避免的话,我宁愿不写 getter 函数。
  • 我认为问题是关于 $class= 'Demo' 而不是 $var = 'foo'。但是是的,它适用于 php >= 5.3
  • 所有你能做的都在这里得到很好的解释:php.net/manual/en/language.namespaces.dynamic.php
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-16
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 2016-10-13
    相关资源
    最近更新 更多