Ответ
Конструкция 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]
Важные особенности:
- Переменные захватываются по значению по умолчанию
- Для захвата по ссылке нужно указать
&перед переменной - Значения фиксируются в момент определения функции, а не вызова
- Можно захватывать несколько переменных:
use ($a, $b, &$c) - В PHP 7.4+ можно использовать стрелочные функции для автоматического захвата