2013-05-31 10 views
8

静的クロージャにインスタンスをバインドすることはできますか、静的クラスメソッド内に非静的クロージャを作成することはできますか?これが可能ではないかもしれないよう静的クロージャへのオブジェクトインスタンスのバインド

これは私が何を意味するかですが...

<?php 
class TestClass { 
    public static function testMethod() { 
     $testInstance = new TestClass(); 
     $testClosure = function() use ($testInstance) { 
      return $this === $testInstance; 
     }; 

     $bindedTestClosure = $testClosure->bindTo($testInstance); 

     call_user_func($bindedTestClosure); 
     // should be true 
    } 
} 

TestClass::testMethod(); 

答えて

3

PHPは常に、新しく作成されたクロージャに親のthisscopeをバインドします。静的クロージャと非静的クロージャの違いは、scope(!= NULL)ですがthisではなく、の作成時刻がであることです。 「トップレベル」クロージャーにはthisscopeもありません。

したがって、クロージャを作成するときにスコープを削除する必要があります。幸いにもbindToは、静的なクロージャの場合でも、それを正確に許可します:

$m=(new ReflectionMethod('TestClass','testMethod'))->getClosure()->bindTo(null,null); 
$m(); 
+0

だからあなたはthetスコープ(これはすでにnullではない)を非静的なクロージャにするために削除する必要があると言っていますか? – andig

1

任意のバインドされたオブジェクト(パラメータnewthisの値を持つことができないClosure::bindTo documentation

静的閉鎖から、見えるはずそれでも、この関数はクラススコープを変更するために使用できます。

+1

これは私の主張です。静的メソッド内で非静的クロージャをどうやって作るのですか? – Nathaniel

関連する問題