PHP相当于[&,epsilon] C ++"捕获" lambda中的变量?

时间:2015-08-06 08:18:43

标签: php lambda

有没有办法可以通过引用lambda函数传递当前在范围内的任何变量而不在use(...)语句中列出它们?

这样的东西
$foo = 12;
$bar = 'hello';

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

// execute $run function

导致$foo等于13$bar等于'bye'

2 个答案:

答案 0 :(得分:1)

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 :(得分:0)

您可以将ctrl-cget_defined_vars()一起使用:

extract()