使用类静态变量作为闭包使用列表的一部分


Use a class static variable as part of a closure use list

我想"使用"一个静态类变量作为闭包的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版本,你真的应该升级…