2

我有一个正在调用的静态函数,它给出了一个奇怪的错误。下面是一个php代码示例:

class foo {
     public $stat;
     public function __construct() {
         $this->stat = stat::isValid('two');
     }
}

class stat {
     protected static $invalidNumbers = array('one', 'two');
     function isValid($number) {
         return in_array($number, static::$invalidNumbers);
     }
}

$foo = new foo();
var_dump($foo->stat);

此代码导致以下错误:

Fatal error: Access to undeclared static property: foo::$invalidNumbers

但是更改static::self::使代码按预期运行。我的印象是在这种情况下使用static::应该有效。

为什么使用会发生此错误static

4

3 回答 3

6

您首先在静态上下文中进行方法调用:

stat::isValid('two');

当您执行此操作时,PHP 会“记住”在其中isValid被专门调用的上下文,以便当它看到类似static::方法主体内部的内容时,它可以解析要绑定的内容,确定您尝试访问的某些属性是否可见,并在一般能够实现一些OO相关的语言特性。

实际的方法isValid不是, staticPHP 仍然允许您使用静态方法语法调用它(它确实给出了E_STRICT警告)。isValid但是,这具有其本身不参与修改(后期)静态绑定的当前调用上下文的副作用。

结果:当 PHP 看到时static::$invalidNumbers它仍然认为你在foo中进行静态方法调用已经完成了一半!一旦你意识到这一点,很明显为什么会static::解决foo::并最终在错误的地方寻找属性。

如果您正确声明isValidstatic

 static function isValid($number) {
     return in_array($number, static::$invalidNumbers);
 }

然后在调用该方法时,PHP在内部更新其上下文并设法绑定到预期的成员。

于 2013-04-25T20:33:39.067 回答
3

您正在尝试stat::isValid()静态调用该方法,但尚未声明它static。将类更改stat为:

class stat {
     protected static $invalidNumbers = array('one', 'two');

     // needs to be declared static
     static function isValid($number) {
         return in_array($number, static::$invalidNumbers);
     }
}

请注意,如果您添加

| E_STRICT

在 php.ini 中的 error_reporting 中,您会看到如下消息:

严格标准:不应该静态调用非静态方法 stat::isValid(),假设 $this 来自不兼容的上下文...

于 2013-04-25T20:27:24.490 回答
2

正确声明static方法

代替

 function isValid($number) {

public static function isValid($number) {   
         ^--- here  
于 2013-04-25T20:30:13.367 回答