2009-11-01 15 views
5

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

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()"
Is questa è una limitazione dell'implementazione dell'oggetto callable, o sto fraintendendo qualcosa?

risposta

1

stesse ragioni non si può fare questo:

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

o anche questa sintassi

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

perché PHP non fa breve mano molto bene.

+0

Principalmente a causa della digitazione libera. Non c'è modo di inferire in realtà ciò che si potrebbe voler dire, quindi il valore predefinito è l'errore all'inizio. –

+0

Ho scritto un preparatutto dispari che consente di scrivere tali espressioni: http://code.google.com/p/php-preparser/ :) (posso "pubblicizzare" le mie soluzioni open-source qui?) –

+5

Questo esempio non è più rilevante, questa sintassi funziona ora. –

1

Questo può funzionare:

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

Ma forse è solo più facile e migliore di utilizzare la chiamata pieno? Non sembra essere un modo per ottenere ciò che vuoi lavorare su una riga.

L'errore nella tua domanda indica che sta cercando una funzione definita sulla classe che non esiste. Un oggetto invokable non è una funzione e sembra che non possa essere trattato come uno in questo caso.

+0

non funziona (almeno non per me con php 5.3) »imprevisto T_OBJECT_OPERATOR ...« – knittl

7

Sfortunatamente, questa è (ancora) una limitazione di PHP, ma ha senso quando ci si pensa, in quanto una classe può contenere proprietà e metodi che condividono 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 PHP dovesse consentire la sintassi desiderata, quale funzione sarebbe stata invocata? Sfortunatamente, questo ci lascia solo con call_user_func[_array]() (o copiando $this->log in un'altra variabile e invocandolo).

Tuttavia, sarebbe bello se la seguente sintassi era accettabile:

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

Ma, ahimè, non lo è.

+0

Questa è una stranezza davvero bizzarra. Qualcosa come ($ test-> log)() sembra principalmente una limitazione del parser, non del linguaggio stesso. –

Problemi correlati