将变量变量传递到闭包中会抛出解析错误?

Passing variable variable into closure throws a parse error?

提问人:aborted 提问时间:12/26/2018 更新时间:12/26/2018 访问量:101

问:

我刚刚注意到,如果您尝试将变量变量放入闭包列表中,它会抛出解析错误。示例代码:use

foreach ($array as $key => $item) {
    $$key = $item->something;
    $this->doSomething($key, function ($param) use ($item, $$key) {
        $param->foo($$key);
    });
}

解析错误是这样的:

解析错误:语法错误,意外的“$”,期望“&”或变量(T_VARIABLE)

我在这里做错了什么吗?为什么它不允许我传递变量变量?

如果我将变量变量的值存储在另一个变量中,我可以正常传递它,但这对于我的实际情况来说并不是最佳的。use

php 闭包变量 变量

评论


答:

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 我只能给出一个有根据的猜测:如果你被允许传入语句,你只需在函数体中进行更改,就可以有效地使函数体之外的所有变量在内部可用。这将破坏范围原则。$$keyuse$key