Php 将变量传递到闭包会引发解析错误吗?

Php 将变量传递到闭包会引发解析错误吗?,php,closures,variable-variables,Php,Closures,Variable Variables,我刚刚注意到,如果您试图将一个变量放入闭包的use列表中,它会抛出一个解析错误。示例代码: foreach ($array as $key => $item) { $$key = $item->something; $this->doSomething($key, function ($param) use ($item, $$key) { $param->foo($$key); }); } 分析错误如下: 分析错误:语法错误,意

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

foreach ($array as $key => $item) {
    $$key = $item->something;
    $this->doSomething($key, function ($param) use ($item, $$key) {
        $param->foo($$key);
    });
}
分析错误如下:

分析错误:语法错误,意外的“$”,应为“&”或变量(T_变量)

我有什么地方做错了吗?为什么它不让我传递变量


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

您说您不想将值保存在另一个变量中。但是保存对变量的引用怎么样?这应该在功能上等同于您的代码

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

如果这在“您的实际案例”中不起作用,请细化代码示例或解释原因。

是的,这是一个很好的解决方法,但我想确保我的问题是预期的,或者只是我搞错了什么。为什么PHP不允许像那样传递变量?@Dugi你被PHP多年来的适应性语法咬了一口。一年又一年的黑客式部分实现(比如变量不变语法,即
$
)。这个解决方案是你能得到的最接近的,它总共是一个额外的分配。@Dugi我只能带着一个有根据的猜测:如果你被允许在
use
语句中传递
$$key
,你只需在函数体中更改
$key
,有效地使函数体外部的所有变量在函数体内部可用。这将破坏范围原则。