2010-10-29 20 views
9

क्या कोई तरीका है कि निहित बंद करने में उपयोग के लिए वैश्विक के रूप में शीर्ष-स्तरीय चर घोषित कर सकता है?PHP बंद और अंतर्निहित वैश्विक परिवर्तनीय दायरा

उदाहरण के लिए, इस जैसे कोड के साथ काम करता है, तो

:

$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') 
        ) 
        . 
        . 
        . 

बंद जैसे एक विधि से कहा जाता है:

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

तो सारांश/टी एल में, डॉ, वहाँ है global कीवर्ड या $GLOBALS सुपर-ग्लोबल का उपयोग किए बिना बंद करने (या अन्य कार्यों को मुझे लगता है) में उपयोग के लिए ग्लोबल के रूप में विविध रूप से घोषित करने का एक तरीका?

मैं एक मंच पर इस विषय शुरू कर दिया मैं अक्सर (http://www.vbforums.com/showthread.php?p=3905718#post3905718)

उत्तर

31

आप उन्हें बंद परिभाषा घोषित करने के लिए है:

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

नहीं तो आप global कीवर्ड का उपयोग करना चाहिए। आपको $a का उपयोग करने वाले प्रत्येक बंद होने के लिए ऐसा करना होगा।

+7

ध्यान दें कि 'उपयोग' केवल माता-पिता के दायरे से वैरिएबल चर का उपयोग करता है। एक परिदृश्य में जहां वैश्विक दायरे में बंद नहीं किया गया है, आपको अभी भी 'वैश्विक' कीवर्ड का उपयोग करना होगा। हालांकि यह ओपी के परिदृश्य के लिए काम करना चाहिए। – Gordon

+0

हम्म, मुझे डर था कि यह 'उपयोग' होगा। उम्मीद है कि यह मुद्दा उस प्रणाली में प्रचलित नहीं होगा जो मैं विकसित कर रहा हूं, क्योंकि अधिकांश * वैश्विक * कॉल स्थिर उदाहरणों के लिए संभवतः होंगे। मैं '$ ग्लोबल' और 'call_user_func_array()' पर 'निकालने() 'से युक्त एक चाल के साथ बेवकूफ़ बनाने की कोशिश कर रहा हूं ... – Dan

+5

इसके अलावा, ओपी के उदाहरण में दिखाए गए' $ ++ 'को वैश्विक रूप से लागू नहीं किया जाएगा '$ a' जब तक संदर्भ द्वारा इसका उपयोग नहीं किया जाता है, उदाहरण के लिए, '& $ a'। वस्तुओं का संदर्भ हालांकि संदर्भ में किया जाता है। – Gordon

संबंधित मुद्दे