【问题标题】:PHP: Getting a value of a static variable of an unknown subclass [duplicate]PHP:获取未知子类的静态变量的值[重复]
【发布时间】:2011-04-14 12:43:13
【问题描述】:

可能重复:
From the string name of a class, can I get a static variable?

在父类的某个地方,我需要找到一个可能的子类的静态变量的值,由当前实例确定。

我写道:

  $class = get_class($this);
  $value = isset($class::$foo['bar']) ? $class::$foo['bar'] : 5;

在此示例中,名称在 $class 中的子类具有公共静态 $foo。

我知道使用 $class::$foo['bar'] 不是一段非常漂亮的代码,但它可以在 PHP 5.3.4 上完成工作。

但在 PHP 5.2.6 中,我收到了一个语法错误:
解析错误:语法错误,意外的 T_PAAMAYIM_NEKUDOTAYIM,期待 ',' 或 ')'

是否有另一种方法可以在 PHP 5.2.4+ 上完成相同的工作?

【问题讨论】:

  • 好收获。使用那里提供的解决方案修复它。
  • 嗯,原来的评论被删除了。通过“那里提供的解决方案”,我指的是这是一个重复的问题。见上面的链接。
  • 这种类型的 cmets 是在有人投票关闭问题作为重复问题时自动创建的。如果问题已关闭,则评论将被删除,并且链接将添加到问题的顶部,正如您已经看到的那样...
  • 是的,我刚刚发现。当我投票结束我自己的问题(即举起最后一根稻草)时,自动评论消失了,我的“回复”看起来毫无用处。感谢您的解释。

标签: php static-variables


【解决方案1】:

编辑:反射更好。

您可以尝试get_class_vars 方法。无法访问 PHP 5.2.6,但这适用于 5.2.11...

class Test {
    public static $foo;

    function __construct() {
        echo("...Constructing...<br/>");
        Test::$foo = array();
        Test::$foo['bar'] = 42;
    }

    function __toString() {
        return "Test";
    }
}


$className = 'Test';
$class = new $className();

$vars = get_class_vars($className);

echo($vars['foo']['bar'] . "<br/>");

输出:

...Constructing...
42

【讨论】:

    【解决方案2】:

    这在 PHP 5.2 中不起作用的原因是因为在 PHP 5.3 之前您不允许在类名中使用变量。所以,如果可能的话,请使用eval

    eval('$result = ' . $c . '::$foo[\'bar\'];');
    echo $result;
    

    否则,您将不得不使用子类中的函数来接收值。例如:

    class MyParent {
        public function __construct() {
            $var = $this->_getVariable();
            echo $var['bar'];
        }
    }
    
    class MyChild extends MyParent {
        static $var = array('bar' => 'foo');
    
        protected function _getVariable() {
            return self::$var;
        }
    }
    
    new MyChild();
    

    【讨论】:

    • 虽然这可行,但我使用 SPL 中的 ReflectionProperty 类对其进行了修复,该类可在 PHP 5.2 中访问。
    【解决方案3】:
    class Bar1 {
        static $var = array('index' => 'value');
    }
    class Bar2 extends Bar1 {
    }
    class Foo extends Bar2 {
        static $var = array('index' => 'value in Foo');
        public function __construct() {
            echo parent::$var['index'];
        }
    }
    
    $foo = new Foo();
    

    将输出“值”,但不输出“Foo 中的值”

    希望,这就是你要找的。​​p>

    【讨论】:

    • 不,我特别想访问子类中的变量,而不是超类中的变量。
    • Pelle ten Cate,这正是我的代码所做的。查看更新的代码
    • 我可能会弄乱术语。您正在访问类 Foo 中的 Bar1 变量。我想做相反的事情:假设 Foo 和 Bar2 都有一个公共静态变量 $var,我想在 Bar1 类中的一个函数中访问它,该函数在其他类之一中调用。
    【解决方案4】:

    您可以使用self 关键字在您正在工作的类中获取类静态/调用静态方法,或者使用parent 获取父类。由于 PHP 5.3.0 中 get_class 函数的更改,您可能会在 php 5.2.6 上遇到该错误

    【讨论】:

    • 不,错误是关于后期静态绑定的,这是 PHP 5.3 中引入的一种语法。如果指定了参数,则 get_class 的行为没有改变。如前所述,我正在寻找一个子类中的变量,而不是超类(parent)或self
    猜你喜欢
    • 2014-01-03
    • 1970-01-01
    • 2015-06-02
    • 2012-08-08
    • 1970-01-01
    • 2013-07-12
    • 2013-04-01
    • 1970-01-01
    • 2016-09-29
    相关资源
    最近更新 更多