PHP эквивалентен [& amp ;, epsilon] C ++ & quot; Capturing & quot; переменные в лямбде?

Есть ли способ, которым я могу передать любую переменную в настоящее время в области видимости, ссылаясь на лямбда-функцию, не перечисляя их все в use(...) заявление?

Что-то вроде

$foo = 12;
$bar = 'hello';

$run = function() use (&) {
$foo = 13;
$bar = 'bye';
}

// execute $run function

В результате чего $foo равно 13 а также $bar равно 'bye',

7

Решение

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"
1

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

Вы могли бы использовать 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
0

По вопросам рекламы [email protected]