оператор use () для анонимных функций

Это плохая практика, чтобы использовать его?

Потому что люди говорят, что глобальные переменные — плохая практика, а использование — это использование внешних переменных в функциях, так что это похоже на глобальные переменные.

Вот так это выглядит

$a = 1;
$func = function() use($a){
print $a;
};

2

Решение

Любые аргументы, определенные в аргументах «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» приведет к ошибке разбора

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector