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