gpt4 book ai didi

php - 了解 php 对静态方法的处理(非静态方法不能静态调用)

转载 作者:搜寻专家 更新时间:2023-10-31 20:42:20 26 4
gpt4 key购买 nike

<?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() 失败(当它应该失败时)?

最佳答案

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

Non-static method X::x() cannot be called statically, assuming $this from incompatible context

这实际上是所有非静态魔术方法的情况,正如您在实现中看到的那样: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;
}

关于php - 了解 php 对静态方法的处理(非静态方法不能静态调用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19302585/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com