PHP等价于[&, epsilon] c++ " capture "在lambda中的变量


PHP equivalent to [&, epsilon] C++ "Capturing" variables in lambda?

是否有一种方法可以通过引用lambda函数传递当前范围内的任何变量,而无需在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