Есть ли способ, которым я могу передать любую переменную в настоящее время в области видимости, ссылаясь на лямбда-функцию, не перечисляя их все в use(...)
заявление?
Что-то вроде
$foo = 12;
$bar = 'hello';
$run = function() use (&) {
$foo = 13;
$bar = 'bye';
}
// execute $run function
В результате чего $foo
равно 13
а также $bar
равно 'bye'
,
TL; DR Короткий ответ — нет. Вам нужно назвать переменные
Вам не нужны закрывающие переменные для этого. Это даже не правильно использовать use
с именованными функциями, поскольку у него не будет вложенной лексической области видимости. Использовать global
ключевое слово, чтобы сделать переменные «динамическими». Вы должны назвать все переменные, которые являются специальными.
$foo = 12;
$bar = 'hello';
function run() {
global $foo,$bar;
$foo = 13;
$bar = 'bye';
}
run();
print "$foo, $bar\n"; // prints "13, bye"
Для лексических анонимных функций вам нужно назвать все переменные с помощью use
ключевое слово и использование &
чтобы получить ссылку:
$foo = 12;
$bar = 'hello';
$run = function () use (&$foo,&$bar) {
$foo = 13;
$bar = 'bye';
};
call_user_func($run);
print "$foo, $bar\n"; // prints "13, bye"
Вы могли бы использовать get_defined_vars()
вместе с extract()
:
$foo = 12;
$bar = 'hello';
$vars = get_defined_vars();
foreach (array_keys($vars) as $var) {
$vars[$var] = &$$var; // keep refs of all variables from current scope
}
$run = function() use($vars) {
extract($vars, EXTR_REFS);
$foo = 13;
$bar = 'bye';
};
// execute $run function
$run();
print $foo; // prints 13
print $bar; // prints bye