Вызов __invoke с параметром типа callable выдает предупреждение - PullRequest
0 голосов
/ 15 июня 2019

Я заметил (более или менее) странное поведение 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 вообще не принимал нестатические методы как вызываемые без фактического экземпляра объекта, это было бы понятно, но зачем говорить, что это действительно так, а затем генерировать предупреждение?

Это ошибка или "фича"?

...