2013-05-31 4 views
8

Ist es möglich, eine Instanz an eine statische Closure zu binden oder innerhalb einer statischen Klassenmethode eine nicht statische Closure zu erstellen? DieseBinden von Objektinstanzen an statische Closures

ist, was ich meine ...

<?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(); 

Antwort

3

PHP bindet immer die Eltern this und scope an neu erstellte Verschlüsse. Der Unterschied zwischen einem statischen Verschluss und einem nicht statischen Verschluss besteht darin, dass ein statischer Verschluss scope (! = NULL), aber nicht this bei Erstellungszeitpunkt hat. Ein "Top-Level" Verschluss hat weder this noch scope.

Daher muss man beim Erstellen des Verschlusses den Geltungsbereich loswerden. Zum Glück bindTo ermöglicht genau das, auch für statische Verschlüsse:

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

Sie sagen also, dass der Geltungsbereich (nicht das ehich bereits null ist) entfernt werden muss, um es zu einem nicht statischen Abschluss zu machen? – andig

1

Sieht aus wie dies nicht möglich sein, von Closure::bindTo documentation

Statische Verschlüsse kann keine gebundene Objekt haben (den Wert des Parameters newthis sollte NULL sein), aber diese Funktion kann dennoch verwendet werden, um ihren Klassenbereich zu ändern.

+1

Das ist mein Punkt. Wie machen Sie einen nicht statischen Verschluss innerhalb einer statischen Methode? – Nathaniel