我至少在我身上注意到了PHP的一种(或多或少)奇怪的行为。
当我使用以下签名__invoke(callable $callable)
作为参数[Foo::class, 'methodName']
调用__invoke方法时,显示警告并显示以下消息:
非静态方法Foo :: methodName()不应被静态调用 。
仅当可调用对象为数组形式时才会发生这种情况,例如:[Foo::class, 'methodName']
,显然,如果传递了Foo实例而不是Foo :: class,则不会显示警告。
因为我想通过ErrorHandler拦截任何问题,所以我将警告等转换为异常
error_reporting(E_ALL);
set_error_handler(function ($severity, $message, $file, $line) {
// ...
});
然后我们有以下假设类,Foo和Bar
class Foo {
public function __invoke(callable $callable)
{
var_dump($callable);
}
}
class Bar {
public function isFoo(): bool {
return false;
}
}
以及调用时的行为:
$foo = new Foo();
$foo([new Bar(), 'isFoo']); // object(Bar)[3]
$foo(function() {}) // object(Closure)[3]
$foo([Bar::class, 'isFoo']); // Fatal error: Uncaught ErrorException: Non-static method Bar::isFoo() should not be called statically
在产生误解之前:我当然知道该警告要表达的意思,但我想知道的是为什么警告是首先发出。为什么。 / p>
有点像
“在我不知道您实际要做什么的情况下,让我告诉您这是有问题的。”
如果PHP在没有实际的对象实例的情况下根本不接受非静态方法作为可调用方法,那么这是可以理解的,但是为什么要说这是有效的然后发出警告呢?
是错误还是“功能”?