0

可能重复:
从类的字符串名称中,我可以得到一个静态变量吗?

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

我写:

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

在这个例子中,名字所在的子类$class有一个 public static $foo。

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

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

是否有另一种方法可以在 PHP 5.2.4+ 上完成同样的事情?

4

4 回答 4

1

这在 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();
于 2011-04-14T14:09:15.767 回答
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
于 2011-04-14T12:58:45.247 回答
0
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中的价值”

希望,这就是你要找的。

于 2011-04-14T12:48:55.247 回答
-1

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

于 2011-04-14T12:46:42.533 回答