Замыкания в PHP
Добавить в избранное
Замыкания (или closures) в PHP - это анонимные функции, которые могут использовать переменные из своего внешнего (локального) окружения. Эти переменные передаются через специальное выражение use(). Замыкания часто используются для создания гибких функций с сохранением состояния переменных вне их тела.
Рассмотрим обычную анонимную функцию, которая пытается использовать переменную из внешней области видимости:
<?php $number = 89; $showNumber = function() { echo $number; }; $showNumber(); ?>
В этом примере переменная $showNumber является анонимной функцией, которая пытается вывести значение внешней переменной $number. Однако, при выполнении кода вы получите ошибку:
Warning: Undefined variable $number
Это происходит потому, что внутри анонимной функции переменная $number недоступна. По умолчанию анонимные функции в PHP не имеют доступа к переменным из внешней области видимости.
Использование use
Чтобы передать внешние переменные в анонимную функцию, используется ключевое слово use(). Оно позволяет захватить переменные из внешней области и сделать их доступными внутри функции:
<?php $number = 89; $showNumber = function() use($number) { echo $number; }; $showNumber(); ?>
Теперь переменная $number будет передана в анонимную функцию, и при выполнении этого кода вы получите на экране число 89.
Передача нескольких переменных
Замыкание может захватывать несколько переменных из внешней области. Рассмотрим пример:
<?php $a = 8; $b = 10; $closure = function($c) use($a, $b) { return $a + $b + $c; }; $result = $closure(22); // 40 echo $result; ?>
Здесь в анонимную функцию передаются переменные $a и $b через выражение use(). Также функция принимает параметр $c. В результате выполнение выражения $a + $b + $c возвращает 40.
Важные моменты при работе с замыканиями
1. Передача по значению: При передаче переменных через use(), они передаются по значению, то есть создаётся их копия. Изменение внешней переменной после передачи в функцию не отразится внутри замыкания.
<?php $num = 5; $closure = function() use($num) { echo $num; }; $num = 10; $closure(); // Выведет 5 ?>
2. Передача по ссылке: Если необходимо, чтобы замыкание использовало обновлённое значение переменной, её нужно передать по ссылке. Для этого перед именем переменной ставится амперсанд &:
<?php $num = 5; $closure = function() use(&$num) { echo $num; }; $num = 10; $closure(); // Выведет 10 ?>
3. Использование замыканий для создания динамических функций: Замыкания часто применяются, когда нужно создать гибкую функцию, которая использует состояние из внешней среды.
Пример с замыканием в реальной задаче
Предположим, вам нужно создать функцию для фильтрации массива чисел на основе предельного значения:
<?php $limit = 10; $numbers = [5, 12, 7, 15, 9]; $filter = function($number) use($limit) { return $number < $limit; }; $result = array_filter($numbers, $filter); print_r($result); // Выведет: Array ( [0] => 5 [2] => 7 [4] => 9 ) ?>
Здесь анонимная функция принимает число и сравнивает его с переменной $limit, которая была захвачена из внешней области. Затем функция передаётся в array_filter, который фильтрует массив по условию.
Заключение
Замыкания являются мощным инструментом в PHP, позволяя анонимным функциям захватывать переменные из внешнего контекста. Они делают код более гибким и удобным для создания динамических функций.