提问人:aborted 提问时间:12/26/2018 更新时间:12/26/2018 访问量:101
将变量变量传递到闭包中会抛出解析错误?
Passing variable variable into closure throws a parse error?
问:
我刚刚注意到,如果您尝试将变量变量放入闭包列表中,它会抛出解析错误。示例代码:use
foreach ($array as $key => $item) {
$$key = $item->something;
$this->doSomething($key, function ($param) use ($item, $$key) {
$param->foo($$key);
});
}
解析错误是这样的:
解析错误:语法错误,意外的“$”,期望“&”或变量(T_VARIABLE)
我在这里做错了什么吗?为什么它不允许我传递变量变量?
如果我将变量变量的值存储在另一个变量中,我可以正常传递它,但这对于我的实际情况来说并不是最佳的。use
答:
1赞
Anders Carstensen
12/26/2018
#1
您说您不想将该值保存在另一个变量中。但是,保存对变量的引用呢?这在功能上应该等同于您的代码。
foreach ($array as $key => $item) {
$$key = $item->something;
$otherVar = &$$key;
$this->doSomething($key, function ($param) use ($item, $otherVar) {
$param->foo($otherVar);
});
}
如果这在“您的实际情况”中不起作用,请改进代码示例或解释原因。
评论
0赞
aborted
12/26/2018
是的,这个解决方法很棒,但我想确保我的问题实际上是意料之中的,或者只是我搞砸了什么。为什么 PHP 不允许像这样传递变量?
1赞
Sébastien Renauld
12/26/2018
@Dugi你被PHP多年的自适应语法咬住了。年复一年的黑客部分实现的东西(如可变不变语法,即)。这个解决方案是最接近你的,它总共是一个额外的分配。$$
0赞
Anders Carstensen
12/26/2018
@Dugi 我只能给出一个有根据的猜测:如果你被允许传入语句,你只需在函数体中进行更改,就可以有效地使函数体之外的所有变量在内部可用。这将破坏范围原则。$$key
use
$key
上一个:使用变量提取 json 数据?
评论