PHP Callable oggetto come oggetto membro
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?
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.