les fermetures sont belles! ils résoudre beaucoup de problèmes qui viennent avec des fonctions anonymes, et de les rendre très élégant de code possible (au moins aussi longtemps que nous parlons de php).
les programmeurs javascript utilisation de fermetures de tous les temps, parfois même sans le savoir, parce que lié variables ne sont pas définies explicitement que "l'utilisation" est en php.
il y a de meilleurs exemples du monde réel que dans le cas précédent. disons que vous avez le tri d'un tableau multidimensionnel par une sous-valeur, mais les principaux changements.
<?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: le code non testé (je n'ai pas de php5.Installé 3 atm), mais ça devrait ressembler à quelque chose comme ça.
il y a un inconvénient: beaucoup de développeurs php peut être un peu impuissant si vous confronter à des fermetures.
pour comprendre le nice-ty de fermetures de plus, je vais vous donner un autre exemple, cette fois en javascript. l'un des problèmes est la détermination de la portée et le navigateur inhérente asynchronity. en particulier, si elle vient à l' window.setTimeout();
(ou intervalle). donc, vous passez d'une fonction à setTimeout, mais vous ne pouvez pas vraiment donner les 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 retourne une fonction avec un type de paramètre prédéfini!
pour être honnête, j'aime le php beaucoup plus puisque 5.3 et les fonctions anonymes et les fermetures. les espaces de noms peuvent être plus importantes, mais ils sont beaucoup moins sexy.