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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top