Как передать переменные из внешней области видимости в замыкание (closure) в PHP?

«Как передать переменные из внешней области видимости в замыкание (closure) в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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;
});