Anonymous functions e Closures in PHP 5.3
Pagina 1 di 2
A partire da PHP 5.3 sono disponibili le Anonymous functions (Lambda functions) e le Closures... ma di cosa si tratta?
Anonymous functions
Le funzioni anonime ( o lambda ) sono funzioni ( senza nome ) che hanno come utilizzo principale ( anche se non unico ) quello di essere definite come funzioni di callback.
Per chi di voi si chiedesse cos'è una funzione di callback potrei semplificare la definizione in questo modo: una funzione passata come argomento di un altra funzione.
Forse è meglio vedere un esempio, per chiarezza vediamolo prima scritto in pseudocodice, le anonymous e i callback non sono infatti prerogativa di PHP:
// # Callback function callback( parametro ) DO qualcosa con il parametro return risultato elaborazione // # Chiamante function chiamante ( input, callback( parametro) )
Non è ancora chiaro vero? Nessun problema, vediamo un esempio pratico utilizzando la funzione di libreria array_walk la cui signature è:
bool array_walk ( array &$array , callback $funcname [, mixed $userdata ] )
Questa funzione applica ad ogni elemento dell'array $array la funzione di callback $funcname ( tralasciamo $userdata che è opzionale ).
Prima della versione 5.3 di PHP per utilizzarla avremmo dovuto scrivere ad esempio:
$array = array( "Rick", "Giorgio", "Matteo" );
function echoEach ( $item ) {
echo $item . "<br />";
}
array_walk( $array, "echoEach" );
Vediamo come cambia con l'uso delle Lambda:
$array = array( "Rick", "Giorgio", "Matteo" );
array_walk( $array, function( $item ) {
echo $item . "<br />";
});
Per entrambe le versioni l'output sarà:
Rick Giorgio Matteo
Altro esempio, la funzione array_filter, che accetta un array in input ed un callback, signature:
array array_filter ( array $input [, callback $callback ] )
Utilizziamo le funzioni anonime:
$arrayNum = array( 1, 3, 6, 5, 2, 8 );
$filtered = array_filter( $arrayNum, function( $item ){
return $item > 2;
});
print_r( $filtered );
L'output:
Array ( [1] => 3 [2] => 6 [3] => 5 [5] => 8 )
Ossia un array filtrato per i valori maggiori di 2.
Cosa guadagnamo? In leggibilità ed eleganza del codice.







