修改传递给 PHP 匿名函数的变量似乎不会反映在变量的原始范围 [duplicate] 中

Modifying a variable passed to a PHP anonymous function doesn't appear to be reflected in variables original scope [duplicate]

提问人:Dan Stevens 提问时间:11/6/2019 更新时间:11/6/2019 访问量:210

问:

我通过 将一个变量传递到匿名函数(闭包)中,并在闭包体中修改变量值:use

$myVar = false;
$myAnonFunc = function() use ($myVar) {
    $myVar = true;
};
$myAnonFunc();
echo '$myVar => ' . ($myVar ? 'TRUE' : 'FALSE') . PHP_EOL;
// Expected `$myVar => TRUE` but got `$myVar => FALSE`

我希望在闭包中绑定到父范围内,以便对闭包内变量的更改反映在父范围内。这似乎没有发生。对PHP闭包的理解是如何不正确的,我应该期望是什么?如何才能真正做到我想做的事?$myVar$myVar$myVar

上述代码的 REPL

PHP 闭包 匿名函数

评论


答:

3赞 Federkun 11/6/2019 #1

闭包作用域中的副本。更改它不会更改父作用域中的变量。$myVar

如果改为传递变量的引用,您可以做什么。

$myAnonFunc = function() use (&$myVar) {
    $myVar = true;
};

这将按照您的预期运行。

3赞 Rahul 11/6/2019 #2

因为块作用域中的更改保留在块作用域内。如果要更改其地址数据,则可以按引用传递。

$myVar = false;
$myAnonFunc = function() use (&$myVar) { // changes will be reflected at its address
    $myVar = true;
};
$myAnonFunc();
echo '$myVar => ' . ($myVar ? 'TRUE' : 'FALSE') . PHP_EOL;
// Expected `$myVar => TRUE` but got `$myVar => FALSE`

演示

输出

$myVar => TRUE
3赞 Vo Kim Nguyen 11/6/2019 #3

您需要传递对 $myVar 的引用

$myAnonFunc = function() use (&$myVar) {
    $myVar = true;
};