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