Objeto PHP mobilizável como membro Objeto
Pergunta
Eu tenho um Logger
classe que, entre outras coisas tem um Log
método.
Como Log
é o uso mais comum da instância Logger
, tenho __invoke
fio à chamada Log
Outra classe, "Site" contém um membro de "Log", uma instância de Logger.
Por que este trabalho:
$Log = $this->Log;
$Log("Message");
Mas nem isso:
$this->Log("Message");
O ex-falha com "PHP Erro fatal: Chamada para o site undefined method :: Log ()"
É este uma limitação da implementação de objeto que pode ser chamado, ou estou mal-entendido alguma coisa?
Solução
As mesmas razões que você não pode fazer isso:
$value = $this->getArray()["key"];
ou até mesmo este
$value = getArray()["key"];
Como a sintaxe PHP não faz curta mão muito bem.
Outras dicas
Infelizmente, este é (ainda) uma limitação do PHP, mas faz sentido quando você pensa sobre isso, como uma classe pode conter propriedades e métodos que nomes de compartilhamento. Por exemplo:
<?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
?>
Se PHP foram para permitir a sintaxe que você deseja, cuja função seria invocado? Infelizmente, isso só nos deixa com call_user_func[_array]()
(ou copiar $this->log
a outra variável e invocando isso).
No entanto, seria bom se a seguinte sintaxe era aceitável:
<?php
{$test->log}();
?>
Mas, infelizmente, não é.
Isso pode funcionar:
${this->Log}("Message");
Mas talvez seja apenas mais fácil e melhor para usar a chamada completa? Não parece ser uma maneira de obter o que deseja para o trabalho por um line.
O erro na sua pergunta indica que está à procura de uma função definida na classe que não existe. Um objeto invokable não é uma função, e parece que não pode ser tratado como um neste caso.