Замыкания в PHP

FavoriteLoadingДобавить в избранное

Замыкания (или 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, позволяя анонимным функциям захватывать переменные из внешнего контекста. Они делают код более гибким и удобным для создания динамических функций.

Написать Администратору

Вы можете написать Администратору сайта.

отправить