父静态函数调用静态子变量

时间:2011-06-03 20:53:13

标签: php visibility php-5.2 late-static-binding

这是我正在处理的类的简化版本

class A {
   static protected function getVal() {
              return self::$valB;
            }
}
class B extend A {
   static protected $valB = 'Hello';
}
B::getVal(); // Hello

这应该在PHP版本5.2.17中工作还是我设置错误。我目前收到的错误是找不到A::$valB

2 个答案:

答案 0 :(得分:3)

需要后期静态绑定,这在PHP 5.3.0及更高版本中有效。

http://us3.php.net/manual/en/language.oop5.late-static-bindings.php

在getVal中,您希望使用return static::valB;代替return self::valB;

答案 1 :(得分:1)

首先,您的代码语法错误。首先修复它:

class A {
   static protected function getVal() {
       return self::$valB;
   }
}
class B extends A {
   static protected $valB = 'Hello';
}
B::getVal();

现在,这将永远不会起作用,因为getVal受到保护。除非你从A或其中一个孩子那里打电话,否则它将不起作用。

self关键字解析为调用它的类。由于self使用Aself == A

您需要使用后期静态绑定来修复它:

return static::$valB;

最后,我建议您在$valB中声明A以避免致命错误:

class A {
    static protected $valB;
    static protected function getVal() { ... }
}