2014-02-05 3 views
7

das scheint nicht zu funktionieren und ich weiß nicht warum? Sie können statische Schließungen in nicht statischen Methoden erstellen, warum nicht umgekehrt?Wie binde ich eine in einer statischen Funktion erstellte Schließung an eine Instanz

+0

Hmm, scheint nicht mit [ 'bindTo'] zu arbeiten (http://www.php.net/manual/en/closure .bindto.php) entweder. – Charles

+0

Aus der BindTo-Dokumentation "Statische Closures können kein gebundenes Objekt haben (der Wert des Parameters newthis sollte NULL sein), aber diese Funktion kann trotzdem verwendet werden, um ihren Klassenbereich zu ändern." http://www.php.net/manual/en/closure.bindto.php, und da bind ist nur die statische von bindTo ich denke, Sie können nicht eine statische Schließung in einem statischen Kontext. – FabioCosta

+0

Dies ist in PHP 7 behoben. Siehe Bugs [# 64761] (https://bugs.php.net/bug.php?id=64761) und [# 68792] (https://bugs.php.net/bug .php? id = 68792). – bishop

Antwort

6

Wie ich auf meinem Kommentar sagte, scheint es, dass Sie das "$ this" nicht von einer Schließung ändern können, die aus einem statischen Kontext kommt. "Static closures cannot have any bound object (the value of the parameter newthis should be NULL), but this function can nevertheless be used to change their class scope." Ich denke, man wird so etwas machen:

class RegularClass { 
     private $name = 'REGULAR'; 
    } 

    class Holder{ 
     public function getFunc(){ 
      $func = function() 
      { 
       // this is a static function unfortunately 
       // try to access properties of bound instance 
       echo $this->name; 
      }; 
      return $func; 
     } 
    } 
    class StaticFunctions { 
     public static function doStuff() 
     { 


      $rc = new RegularClass(); 
      $h=new Holder(); 
      $bfunc = Closure::bind($h->getFunc(), $rc, 'RegularClass'); 

      $bfunc(); 
     } 
    } 

    StaticFunctions::doStuff(); 
Verwandte Themen