Любые аргументы, определенные в «Использовать» аргументы для анонимной функции используют значение в то время, когда анонимная функция определена; поэтому они должны существовать в этот момент; но при вызове функции они не должны передаваться (или даже присутствовать в области вызова).
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 упомянул в своем комментарии, аргументы передаются анонимная функция как «стандартная» может иметь значения по умолчанию, typehints и т. д., тогда как аргументы «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']);
Или (как показывает третий вызов, аргументы могут быть переданы непосредственно.
Энди из них применяется к «использовать» аргумент приведет к ошибке синтаксического анализа
Нет это не является плохим практика, на самом деле это почти необходимо для обратных вызовов из array_walk()/usort() и т. д., у которых есть фиксированные аргументы, и вам нужны дополнительные значения, которые подаются на функцию –
^^ ИЛИ, если возможно, я думаю, что еще лучше было бы передать его как аргумент (Then у вас также есть несколько дополнительных опций, чтобы сделать его необязательным и значением по умолчанию) – Rizier123
Однако большая разница между стандартными аргументы, переданные функции и аргументы «use», - это то, что стандартными аргументами являются значения, доступные в момент, когда вызывается функция, тогда как аргументы «use» являются значениями в точке, где определена функция. –