Это плохая практика, чтобы использовать его?
Потому что люди говорят, что глобальные переменные — плохая практика, а использование — это использование внешних переменных в функциях, так что это похоже на глобальные переменные.
Вот так это выглядит
$a = 1;
$func = function() use($a){
print $a;
};
Любые аргументы, определенные в аргументах «use» для анонимной функции, используют значение в то время, когда анонимная функция определена; поэтому они должны существовать в этой точке; но их не нужно передавать (или даже существовать в области вызова) при вызове функции.
function myFunctionCreator() {
$a = 1; // Must exist for the `use` clause
$func = function() use($a){
echo $a, PHP_EOL;
};
return $func;
}
$myFunc = myFunctionCreator();
$a = 2;
$myFunc(); // echoes 1 (value of $a at the point where the function was created)
Как видно из приведенного выше примера, $a
имеет значение 1
в точке, где определена функция, и даже если переменная с тем же именем существует в точке, когда вызывается функция, она является исходной $a
(со значением 1
), который используется в вызове функции.
Аргументы, определенные в определении основного аргумента, не должны существовать, когда функция определена, но значения должны быть переданы в качестве аргументов функции в тот момент, когда она вызывается.
function myFunctionCreator() {
$a = 1; // Need not exist, and will be ignored
$func = function($a) {
echo $a, PHP_EOL;
};
return $func;
}
$myFunc = myFunctionCreator();
$value = 2;
$myFunc($value); // echoes 2 (value of $a explicitly passed to the function call
// at the time it is executed)
Таким образом, поведение этих двух типов совершенно различно, и их назначение в сочетании обеспечивает определенную степень гибкости.
Как Rizier123 упомянул в своем комментарии, аргументы, передаваемые анонимной функции как «стандартные», могут иметь значения по умолчанию, напечатанные шрифты и т. Д., Тогда как аргументы «use» не могут.
function myFunctionCreator() {
$func = function(array $dataset = [1,2,3]) {
foreach($dataset as $value) {
echo $value, PHP_EOL;
}
};
return $func;
}
$myFunc = myFunctionCreator();
$value = ['a','b','c'];
$myFunc($value);
$myFunc();
$myFunc(['x','y','z']);
Или (как показывает третий вызов, аргументы могут быть переданы напрямую.
Andy из этих примененных к аргументу «use» приведет к ошибке разбора
Других решений пока нет …