PHP Callable Object as Object Member

У меня есть класс Logger который, помимо прочего, имеет метод Log .
Поскольку Log является наиболее распространенным использованием экземпляра Logger , я подключил __invoke для вызова Log

Другой класс, «Сайт» содержит член «Лог», экземпляр Logger.

Зачем это работает:

 $Log = $this->Log; $Log("Message"); 

Но не это:

 $this->Log("Message"); 

Первая ошибка с «PHP Fatal error: вызов неопределенного метода Site :: Log ()»
Является ли это ограничением реализации вызываемого объекта или я что-то не понимаю?

    Те же причины, по которым вы не можете этого сделать:

    $value = $this->getArray()["key"];

    или даже это

    $value = getArray()["key"];

    Поскольку синтаксис PHP не делает короткую руку очень хорошо.

    К сожалению, это (по-прежнему) ограничение PHP, но имеет смысл, когда вы думаете об этом, поскольку класс может содержать свойства и методы, которые обмениваются именами. Например:

     <?php class Test { public $log; public function __construct() { $this->log = function() { echo 'In Test::log property'; }; } public function log() { echo 'In Test::log() method'; } } $test = new Test; $test->log(); // In Test::log() method call_user_func($test->log); // In Test::log property ?> 

    Если PHP должен разрешить синтаксис, который вы хотите, какая функция будет вызываться? К сожалению, это оставляет нас только с помощью call_user_func[_array]() (или копирует $this->log на другую переменную и вызывает это).

    Однако было бы неплохо, если бы следующий синтаксис был приемлемым:

     <?php {$test->log}(); ?> 

    Но, увы, это не так.

    Это может работать:

     ${this->Log}("Message"); 

    Но, возможно, проще и лучше использовать полный вызов? Кажется, что нет способа получить то, что вы хотите работать в одной строке.

    Ошибка в вашем вопросе указывает, что он ищет функцию, определенную в классе, который не существует. Invokable object не является функцией, и, похоже, в этом случае он не может рассматриваться как один.