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 не является функцией, и, похоже, в этом случае он не может рассматриваться как один.