我想"使用"一个静态类变量作为闭包的use list语句的一部分?
下面的代码段会因为意外的'self'解析错误而失败。
array_walk($_categories, function($c, $i) use (&self::$tree) {
或array_walk($_categories, function($c, $i) use (self::&$tree) {
解析错误:语法错误,意想不到的'self' (T_STRING),期望变量(T_VARIABLE)
在这种非常特殊的情况下有什么特殊的语法吗?
你到底为什么要这么做?在使用self
的情况下,闭包是在类的某个地方明确定义的,因此无论如何都可以访问静态成员:
class Foo
{
protected static $bar = 123;
public function test()
{
return function($x) {
static::$bar += $x; // or self::$bar
return static::$bar;
};
}
}
$x = new Foo;
$y = $x->test();
var_dump($y(1));//int(124)
var_dump($y(2));//int(126)
根本不需要在引用上瞎折腾…
如果您使用的是EOL'ed版本的PHP(例如5.3),您可以通过首先为静态成员分配引用来解决这个问题,然后通过use
传递对该引用的引用:
public function test()
{
$staticRef = &static::$bar;
return function($x) use (&$staticRef) {
$staticRef += $x;
return $staticRef;
};
}
但是如果你还在使用一个很久以前的PHP版本,你真的应该升级…