2

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

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.

4

2 回答 2

3

需要后期静态绑定,它存在于 PHP 5.3.0 及更高版本中。

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

在 getVal 中,您希望使用return static::valB;而不是return self::valB;

于 2011-06-03T20:55:28.727 回答
1

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

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

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

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

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

return static::$valB;

最后,我建议您也声明$valBA避免致命错误:

class A {
    static protected $valB;
    static protected function getVal() { ... }
}
于 2011-06-03T21:01:23.647 回答