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