提问人:Dan Stevens 提问时间:11/6/2019 更新时间:11/6/2019 访问量:210
修改传递给 PHP 匿名函数的变量似乎不会反映在变量的原始范围 [duplicate] 中
Modifying a variable passed to a PHP anonymous function doesn't appear to be reflected in variables original scope [duplicate]
问:
我通过 将一个变量传递到匿名函数(闭包)中,并在闭包体中修改变量值: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
答:
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;
};
评论