2010-10-29 16 views
9

Gibt es eine Möglichkeit, dass man implizit Top-Level-Variablen als global für den Einsatz in Schließungen deklarieren kann?PHP-Verschlüsse und implizite globale Variable Bereich

Zum Beispiel, wenn mit dem Code arbeiten wie folgt aus:

$a = 0; //A TOP-LEVEL VARIABLE 

Alpha::create('myAlpha') 
    ->bind(DataSingleton::getInstance() 
     ->query('c') 
    ) 
    ->addBeta('myBeta', function($obj){ 
     $obj->bind(DataSingleton::getInstance() 
       ->query('d') 
      ) 
      ->addGamma('myGamma', function($obj){ 
       $obj->bind(DataSingleton::getInstance() 
         ->query('a') 
        ) 
        ->addDelta('myDelta', function($obj){ 
         $obj->bind(DataSingleton::getInstance() 
          ->query('b') 
         ); 
        }); 
      }) 
      ->addGamma('myGamma', function($obj){ 

       $a++; //OUT OF MY SCOPE 

       $obj->bind(DataSingleton::getInstance() 
         ->query('c') 
        ) 
        . 
        . 
        . 

Die Verschlüsse von einer Methode als solche genannt werden:

public function __construct($name, $closure = null){ 
     $this->_name = $name; 
     is_callable($closure) ? $closure($this) : null; 
    } 

Also zusammenfassend/TL; DR, ist es eine Möglichkeit, Variablen implizit als global für die Verwendung in Schließungen (oder anderen Funktionen, die ich vermute) zu deklarieren, ohne das Schlüsselwort global oder $GLOBALS super-global zu verwenden?

begann ich dieses Thema in einem anderen Forum habe ich häufig (http://www.vbforums.com/showthread.php?p=3905718#post3905718)

Antwort

31

Sie haben sie in der Verschluss Definition zu erklären:

->addBeta('myBeta', function($obj) use ($a) { // ... 

Andernfalls Sie die global Schlüsselwort verwenden. Sie müssen dies für jede Schließung, die $a verwendet auch tun.

+7

Beachten Sie, dass 'use' nur Variablen vom übergeordneten Bereich erbt. In einem Szenario, in dem die Closures nicht im globalen Gültigkeitsbereich definiert sind, müssen Sie stattdessen das Schlüsselwort 'global' verwenden. Es sollte jedoch für das OP-Szenario funktionieren. – Gordon

+0

Hmm, ich hatte Angst, es wäre "nutzen". Hoffentlich wird dieses Problem in dem System, das ich entwickle, nicht vorherrschend sein, da die meisten * globalen * Aufrufe wahrscheinlich zu statischen Instanzen gemacht werden. Ich versuche mit einem Trick zu experimentieren, der 'extract()' auf '$ GLOBALS' und 'call_user_func_array()' mit einbezieht ... – Dan

+5

Außerdem würde '$ a ++' wie im Beispiel des OPs nicht auf das globale Beispiel angewendet '$ a', es sei denn, es wird als Referenz verwendet, z. B.' & $ a'. Objekte werden jedoch als Referenz verwendet. – Gordon