3
<?php

class T {
        public function x(){
                return true;
        }    
}
var_dump(T::x());

class X {
        public function x(){
                return true;
        }

}    
var_dump(X::x());

此代码导致:

bool(true)
PHP Fatal error:  Non-static method X::x() cannot be called statically in test.php on line 16

为什么 T::x() 工作(当它应该失败时)而 X::x() 失败(因为它应该)?

4

1 回答 1

3

X::x()实际上是一个 PHP4 风格的构造函数,因为它共享相同的类名。并且以静态方式调用类的构造函数会引发致命错误:

非静态方法 X::x() 不能被静态调用,假设 $this 来自不兼容的上下文

正如您在实现中看到的那样,所有非静态魔术方法实际上都是这种情况:http: //lxr.php.net/xref/PHP_5_5/Zend/zend_compile.c#1636

唯一可能被隐式静态调用(并引发 an E_STRICT)的情况是函数没有特殊处理:

if (some large if/else's for the magic methods) {
    // flag isn't set…
} else {
    CG(active_op_array)->fn_flags |= ZEND_ACC_ALLOW_STATIC;
}
于 2013-10-10T18:24:31.113 回答