les fermetures sont belles! ils résolvent beaucoup de problèmes qui viennent avec des fonctions anonymes et rendent possible un code vraiment élégant (au moins aussi longtemps que nous parlons de php).
les programmeurs javascript utilisent des fermetures tout le temps, parfois même sans le savoir, car les variables liées ne sont pas explicitement définies - c'est à cela que sert "utilisation" en php.
il y a de meilleurs exemples du monde réel que celui ci-dessus. disons que vous devez trier un tableau multidimensionnel par une sous-valeur, mais la clé change.
<?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);
?>
avertissement: code non testé (je n'ai pas php5.3 installé atm), mais il devrait ressembler à quelque chose comme ça.
il y a un inconvénient: beaucoup de développeurs php peuvent être un peu impuissants si vous les confrontez à des fermetures.
pour mieux comprendre la beauté des fermetures, je vais vous donner un autre exemple - cette fois en javascript. l'un des problèmes est la portée et l'asynchronité inhérente au navigateur. surtout s'il s'agit de window.setTimeout();
(ou -interval). vous passez donc une fonction à setTimeout, mais vous ne pouvez pas vraiment donner de paramètres, car fournir des paramètres exécute le code!
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 renvoie une fonction avec une sorte de paramètre prédéfini!
pour être honnête, j'aime beaucoup plus PHP depuis 5.3 et les fonctions / fermetures anonymes. les espaces de noms peuvent être plus importants, mais ils sont beaucoup moins sexy .