Domanda

Ho un Logger classe che, tra le altre cose ha un metodo Log.
Come Log è l'uso più comune dell'istanza Logger, ho cablato __invoke chiamare Log

Un'altra classe, "Sito" contiene un membro di "Log", un esempio di Logger.

Perché sarebbe questo lavoro:

$Log = $this->Log;  
$Log("Message");  

Ma non questa:

$this->Log("Message");

L'ex fallisce con "Fatal error PHP: Call to metodo non definito del sito :: Log ()"
Si tratta di una limitazione dell'implementazione oggetto invocabile, o sto equivoco qualcosa?

È stato utile?

Soluzione

Gli stessi motivi non si può fare questo:

$value = $this->getArray()["key"];

o anche questo

$value = getArray()["key"];

A causa della sintassi di PHP non fa breve mano molto bene.

Altri suggerimenti

Purtroppo, questo è (ancora) una limitazione di PHP, ma ha senso quando si pensa a questo proposito, come una classe può contenere proprietà e metodi che condividono i nomi. Ad esempio:

<?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 il PHP dovesse consentire la sintassi che desideri, quale funzione sarebbe invocata? Purtroppo, che solo ci lascia con call_user_func[_array]() (o la copia $this->log ad un'altra variabile e il ricorso a tale).

Tuttavia, sarebbe bello se la seguente sintassi era accettabile:

<?php
{$test->log}();
?>

Ma, ahimè, non lo è.

Questo può funzionare:

${this->Log}("Message");

Ma forse è solo più facile e meglio utilizzare la chiamata pieno? Non sembra essere un modo per ottenere ciò che si desidera lavorare su quella riga.

L'errore nella tua domanda indica che è alla ricerca di una funzione definita sulla classe che non esiste. Un oggetto richiamabile non è una funzione, e sembra che non può essere trattato come in questo caso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top