理解php处理静态方法(非静态方法不能静态调用)

时间:2013-10-10 17:41:08

标签: php static-methods

<?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()失败(应该如此)?

1 个答案:

答案 0 :(得分:3)

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

  

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

实际上,您可以在实现中看到所有非静态魔术方法的情况:http://lxr.php.net/xref/PHP_5_5/Zend/zend_compile.c#1636

这个函数没有特殊处理的唯一情况是静态地调用它(并引发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;
}