Ответ
В PHP переменные из родительской области видимости передаются в замыкание с помощью конструкции use. По умолчанию передача происходит по значению.
Базовый пример:
$multiplier = 10;
$closure = function($number) use ($multiplier) {
return $number * $multiplier;
};
echo $closure(5); // Выведет 50
Передача по ссылке:
Если нужно, чтобы замыкание изменяло внешнюю переменную, используется амперсанд &.
$counter = 0;
$increment = function() use (&$counter) {
$counter++;
};
$increment();
$increment();
echo $counter; // Выведет 2
Стрелочные функции (PHP 7.4+): Они автоматически захватывают переменные из родительской области видимости по значению, что делает синтаксис чище.
$factor = 3;
$arrowFn = fn($x) => $x * $factor;
echo $arrowFn(7); // Выведет 21
// $factor внутри стрелочной функции доступна только для чтения
Практическое применение:
Я часто использую замыкания с use в коллбеках, например, для обработчиков событий или в функциях вроде array_map/array_filter, когда нужен дополнительный контекст.
$users = [...];
$minAge = 18;
$adults = array_filter($users, function($user) use ($minAge) {
return $user['age'] >= $minAge;
});