2016-08-08 14 views
0

静的クラス変数をとして使用する場合は、閉包のリストステートメントを使用しますか?クラス静的変数をクロージャ使用リストの一部として使用

以下のスニペットは、単にという予期しない「自己」の解析エラーで失敗します。

array_walk($_categories, function($c, $i) use (&self::$tree) {
OR
array_walk($_categories, function($c, $i) use (self::&$tree) {

Parse error: syntax error, unexpected 'self' (T_STRING), expecting variable (T_VARIABLE)

この非常に特殊なケースで使用するために特別な構文はありますか?

答えて

1

なぜあなたはそれをしたいですか? 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版のPHP(5.3など)を使用している場合は、最初に静的メンバーへの参照を割り当てて、その参照への参照をuse

public function test() 
{ 
    $staticRef = &static::$bar; 
    return function($x) use (&$staticRef) { 
     $staticRef += $x; 
     return $staticRef; 
    }; 
} 
で渡して問題を回避することができます

しかし、もしあなたがまだ大嫌いならあなたがアップグレードしているはずです...

+0

私は単純にラムダがクラスの広いコンテキストにアクセスできないと考えました。しかし実際にはそうです。私は_ ** use ** _ listに乗っていますが、今度はclosure _(5.5.9を使用)_の内部から 'self :: $ tree'を使用するだけです。ありがとうございました。 – Stphane

関連する問題