Я заметил (более или менее) странное поведение PHP, по крайней мере, для меня.Когда я вызываю метод __invoke со следующей подписью __invoke(callable $callable)
с [Foo::class, 'methodName']
в качестве параметра, отображается предупреждение со следующим сообщением:
Нестатический метод Foo :: methodName ()не должен вызываться статически .
Это происходит только в том случае, если вызываемый объект имеет форму массива, например так: [Foo::class, 'methodName']
, очевидно, предупреждение не отображается, если экземпляр Fooпередается вместо Foo :: class.
Поскольку я хочу перехватывать любые проблемы с помощью ErrorHandler, я преобразую предупреждения и т. д. в исключения
error_reporting(E_ALL);
set_error_handler(function ($severity, $message, $file, $line) {
// ...
});
Затем у нас есть следующие гипотетические классы, Foo иБар
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
До возникновения недоразумений: я, конечно, осознаю ЧТО это предупреждение хочет выразить,но что мне интересно, так это ПОЧЕМУ предупреждение выдается в первую очередь.
Кажется, немного похоже на
"Без меня, зная, что вы на самом деле хотитесделать, позвольте мне сказать вамэто проблематично. "
Если бы PHP вообще не принимал нестатические методы как вызываемые без фактического экземпляра объекта, это было бы понятно, но зачем говорить, что это действительно так, а затем генерировать предупреждение?
Это ошибка или "фича"?