Для чего используется use в анонимных функциях PHP

«Для чего используется use в анонимных функциях PHP» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Конструкция use в анонимных функциях (замыканиях) позволяет импортировать переменные из внешней области видимости. Без этого замыкание работает в изолированном контексте и не имеет доступа к переменным родительской функции.

Практический пример — фабрика валидаторов:

function createLengthValidator(int $min, int $max): Closure 
{
    // $min и $max захватываются в момент создания замыкания
    return function(string $value) use ($min, $max): bool {
        $length = mb_strlen($value);
        return $length >= $min && $length <= $max;
    };
}

// Создаем специализированные валидаторы
$usernameValidator = createLengthValidator(3, 20);
$passwordValidator = createLengthValidator(8, 255);

// Используем
var_dump($usernameValidator("alice"));  // true
var_dump($usernameValidator("ab"));     // false

Передача по ссылке:

$counter = 0;
$incrementors = [];

for ($i = 0; $i < 3; $i++) {
    // Без & каждая функция получит копию $counter
    // С & все функции работают с одной переменной
    $incrementors[] = function() use (&$counter) {
        $counter++;
        return $counter;
    };
}

foreach ($incrementors as $inc) {
    echo $inc() . " "; // 1 2 3
}

Использование в array_map с внешним контекстом:

$multiplier = 5;
$numbers = [1, 2, 3, 4];

$result = array_map(
    function($n) use ($multiplier) {
        return $n * $multiplier;
    },
    $numbers
);
// $result = [5, 10, 15, 20]

Важные особенности:

  1. Переменные захватываются по значению по умолчанию
  2. Для захвата по ссылке нужно указать & перед переменной
  3. Значения фиксируются в момент определения функции, а не вызова
  4. Можно захватывать несколько переменных: use ($a, $b, &$c)
  5. В PHP 7.4+ можно использовать стрелочные функции для автоматического захвата