2012-01-31 17 views
5

Eventuali duplicati:
Immediately executing anonymous functionsPosso valutare immediatamente una funzione anonima?

voglio valutare immediatamente una funzione anonima piuttosto che esso appare come un oggetto di chiusura nel metodo args. È possibile?

Ad esempio:

$obj = MyClass; 
$obj->Foo(function(){return "bar";}); // passes a Closure into Foo() 
$obj->Foo(function(){return "bar";}()); // passes the string "bar" into Foo()? 

La terza linea è la sintassi illegale - non v'è alcun modo per fare questo?

Grazie

+0

È difficile immaginare perché è necessario farlo? Perché non basta assegnare il risultato della funzione a una variabile e quindi passare quella variabile? –

+0

Anche in questi esempi la tua funzione è praticamente solo una funzione anonima, non ha caratteristiche di chiusura, non sta 'ricordando' alcuna variabile dal suo contesto attuale –

+1

Mi rendo conto che, davvero non volevo spiegare perché ho bisogno per fare questo - ovviamente è una situazione insolita. – Tom

risposta

2

si potesse fare con call_user_func ... anche se questo potrebbe essere un po 'sciocco quando si può solo assegnarlo a una variabile e, successivamente, richiamare la variabile.

call_user_func(function(){ echo "bar"; });

Si potrebbe pensare che il PHP 5.4 con la sua capacità di dereferenziazione sarebbe rendere questo possibile. Ti sbaglierebbe comunque (come su RC6, comunque).

+0

Perché lo consideri sciocco? – Tadeck

+0

@Tadeck Bene, a me sembra che non abbia senso eseguire una chiamata di funzione aggiuntiva a 'call_user_func' quando si potrebbe facilmente fare' $ f = function() {echo '1'; }; $ f(); 'Sebbene in questo caso non ci sia nulla di tecnicamente non corretto nell'uso di' call_user_func', trovo che l'invocazione esplicita sia più leggibile. Posso vedere l'appello nella brevità di una singola riga con 'call_user_func', però. – rdlowrey

Problemi correlati