le chiusure sono bellissime! risolvono molti problemi associati a funzioni anonime e rendono possibile un codice davvero elegante (almeno finché parliamo di php).
i programmatori javascript usano le chiusure in ogni momento, a volte anche senza saperlo, perché le variabili associate non sono esplicitamente definite - ecco a cosa serve "usare" in php.
ci sono esempi del mondo reale migliori di quello sopra. supponiamo che devi ordinare un array multidimensionale per un sotto-valore, ma la chiave cambia.
<?php
function generateComparisonFunctionForKey($key) {
return function ($left, $right) use ($key) {
if ($left[$key] == $right[$key])
return 0;
else
return ($left[$key] < $right[$key]) ? -1 : 1;
};
}
$myArray = array(
array('name' => 'Alex', 'age' => 70),
array('name' => 'Enrico', 'age' => 25)
);
$sortByName = generateComparisonFunctionForKey('name');
$sortByAge = generateComparisonFunctionForKey('age');
usort($myArray, $sortByName);
usort($myArray, $sortByAge);
?>
attenzione: codice non testato (non ho php5.3 installato atm), ma dovrebbe assomigliare a qualcosa del genere.
c'è un aspetto negativo: molti sviluppatori php potrebbero essere un po 'impotenti se li si confronta con le chiusure.
per capire di più la simpatia delle chiusure, ti faccio un altro esempio: questa volta in JavaScript. uno dei problemi è l'asincronia inerente all'ambito e al browser. soprattutto, se si tratta di window.setTimeout();
(o -intervallo). quindi, si passa una funzione a setTimeout, ma non si può davvero dare alcun parametro, perché fornire parametri esegue il codice!
function getFunctionTextInASecond(value) {
return function () {
document.getElementsByName('body')[0].innerHTML = value; // "value" is the bound variable!
}
}
var textToDisplay = prompt('text to show in a second', 'foo bar');
// this returns a function that sets the bodys innerHTML to the prompted value
var myFunction = getFunctionTextInASecond(textToDisplay);
window.setTimeout(myFunction, 1000);
myFunction restituisce una funzione con un tipo di parametro predefinito!
ad essere sincero, mi piace molto di più il php dalla 5.3 e le funzioni / chiusure anonime. gli spazi dei nomi possono essere più importanti, ma sono molto meno sexy .