zamknięcia są piękne! rozwiązują wiele problemów związanych z funkcjami anonimowymi i umożliwiają naprawdę elegancki kod (przynajmniej tak długo, jak mówimy o php).
programiści javascript używają zamknięć przez cały czas, czasem nawet nie wiedząc o tym, ponieważ zmienne powiązane nie są wyraźnie zdefiniowane - po to właśnie jest „use” w php.
istnieją lepsze przykłady z prawdziwego świata niż powyższy. powiedzmy, że musisz posortować tablicę wielowymiarową według podwartości, ale klucz się zmienia.
<?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);
?>
ostrzeżenie: nieprzetestowany kod (nie mam zainstalowanego bankomatu php5.3), ale powinien on wyglądać tak.
ma jedną wadę: wielu programistów php może być nieco bezradnych, jeśli skonfrontujesz ich z zamknięciami.
aby lepiej zrozumieć wygodę zamykania, dam wam inny przykład - tym razem w javascript. jednym z problemów jest zakres i nieodłączna asynchroniczność przeglądarki. zwłaszcza jeśli chodzi o window.setTimeout();
(lub -interval). więc przekazujesz funkcję do setTimeout, ale tak naprawdę nie możesz podać żadnych parametrów, ponieważ podanie parametrów powoduje wykonanie kodu!
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 zwraca funkcję z rodzajem predefiniowanego parametru!
szczerze mówiąc, bardziej lubię php od 5.3 i anonimowe funkcje / zamknięcia. przestrzenie nazw mogą być ważniejsze, ale są o wiele mniej seksowne .