PHP изначально поддерживает закрытие в 5.3. Закрытие хорошо, когда вам нужна локальная функция, которая используется только для какой-то небольшой, определенной цели. RFC для замыканий дает хороший пример:
function replace_spaces ($text) {
$replacement = function ($matches) {
return str_replace ($matches[1], ' ', ' ').' ';
};
return preg_replace_callback ('/( +) /', $replacement, $text);
}
Это позволяет вам определить функцию replacement
локально внутри replace_spaces()
, так что это не:
1) Загромождение глобального пространства имен
2) Заставить людей три года спустя задуматься, почему существует глобально определенная функция, которая используется только внутри одной другой функции
Это держит вещи организованными. Обратите внимание, что сама функция не имеет имени, она просто определяется и присваивается как ссылка на $replacement
.
Но помните, вы должны ждать PHP 5.3:)
Вы также можете получить доступ к переменным вне области видимости в замыкании, используя ключевое слово use
. Рассмотрим этот пример.
// Set a multiplier
$multiplier = 3;
// Create a list of numbers
$numbers = array(1,2,3,4);
// Use array_walk to iterate
// through the list and multiply
array_walk($numbers, function($number) use($multiplier){
echo $number * $multiplier;
});
Здесь дается отличное объяснение Что такое php лямбды и замыкания