крышки прекрасны! они решают множество проблем, связанных с анонимными функциями, и делают возможным действительно элегантный код (по крайней мере, пока мы говорим о php).
Программисты javascript используют замыкания все время, иногда даже не зная об этом, потому что связанные переменные не определены явно - вот для чего «использование» в php.
Есть лучшие примеры из реальной жизни, чем приведенный выше. Допустим, вам нужно отсортировать многомерный массив по значению, но ключ изменится.
<?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);
?>
предупреждение: непроверенный код (у меня не установлен php5.3 atm), но он должен выглядеть примерно так.
есть один недостаток: многие php-разработчики могут оказаться немного беспомощными, если вы столкнетесь с ними замыканиями.
Чтобы лучше понять замыкания замыканий, приведу еще один пример - на этот раз в javascript. Одной из проблем является асинхронность, присущая браузеру. особенно, если дело доходит до window.setTimeout();
(или -интервала). Итак, вы передаете функцию в setTimeout, но вы не можете дать какие-либо параметры, потому что предоставление параметров выполняет код!
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 возвращает функцию со своего рода предопределенным параметром!
честно говоря, мне больше нравится php с 5.3 и анонимные функции / замыкания. Пространства имен могут быть более важными, но они намного менее сексуальны .