2016-09-30 15 views
5

मैं वर्तमान में जो मुझे वस्तुओं की एक कारखाना बनाने की अनुमति देता एक निर्भरता इंजेक्शन मॉड्यूल है अंदर एक वैश्विक वस्तु का उपयोग कैसे करें:एक विधि बंद

class DiModule 
{ 
    private $Callbacks; 

    public function set(
     $foo, 
     $bar 
    ) { 
     $this->Callbacks[$foo] = $bar; 
    } 

    public function get(
     $foo 
    ) { 
     return $this->Callbacks[$foo]; 
    } 
} 

मैं तो एक घटना वस्तु जो एक विधि बंद करने और संग्रहीत करता है सत्र जो घटना को ट्रिगर करेगा।

class Event 
{ 
    private $Sesh; 
    private $Method; 

    public function set(
     $sesh = array(), 
     $method 
    ) { 
     $this->Sesh = $sesh; 
     $this->Method = $method; 
    } 

    public function get(
    ) { 
     return [$this->Sesh,$this->Method]; 
    } 
} 

मेरे पास एक श्रोता ऑब्जेक्ट है जो सत्र सेट की खोज करता है और उस ऑब्जेक्ट से जुड़े ईवेंट को ट्रिगर करता है।

class Listener 
{ 
    private $Sesh; 
    public function setSesh(
     $foo 
    ) { 
     $this->Sesh = $foo; 
    } 

    private $Event; 
    public function set(
     $foo, 
     Event $event 
    ) { 
     $this->Event[$foo] = $event; 
    } 

    public function dispatch(
     $foo 
    ) { 
     $state = true; 

     if(isset($this->Event[$foo])) 
     { 
      foreach($this->Event[$foo]->get()[0] as $sesh) 
      { 
       if(!isset($this->Sesh[$sesh]) || empty($this->Sesh[$sesh])) 
       { 
        $state = false; 
       } 
      } 
     } 

     return ($state) ? [true, $this->Event[$foo]->get()[1]()] : [false, "Event was not triggered."]; 
    } 
} 

यह इस का एक उदाहरण

$di = new DiModule(); 

$di->set('L', new Listener()); 
$di->set('E', new Event()); 

$di->get('E')->set(['misc'], function() { global $di; return $di; }); 

$di->get('L')->setSesh(array('misc' => 'active')); // not actual sessions yet 
$di->get('L')->set('example', $di->get('E')); 
var_dump($di->get('L')->dispatch('example')); 

निष्पादित किया जा रहा है मुद्दा है जब मैं एक बंद अंदर मेरे वैश्विक $di तक पहुँचने का प्रयास, मैं यह कई बार googled है लेकिन एक समाधान नहीं मिल रहा।

+1

आपके नमूना कोड में केवल एक गलती हो सकती है, लेकिन मेरे लिए ऐसा लगता है कि आपके 'DiModule'' set' और 'get' विधियां मिश्रित हैं। 'सेट' ऑब्जेक्ट को वापस कर रहा है और' get' इसे सेट कर रहा है। – Andy

उत्तर

4

आपको बंद करने के भीतर से बाहरी चर का उपयोग करने के लिए use कीवर्ड का उपयोग करने की आवश्यकता है।

तो यह:

$di->get('E')->set(['misc'], function() { global $di; return $di; }); 

इस तरह लिखा जाना चाहिए: अपने DiModule वर्ग के

$di->get('E')->set(['misc'], function() use ($di) { return $di; }); 
+0

शानदार, यह काम किया! मैं इस कीवर्ड का उपयोग करने में एक नज़र डालेगा - मैंने इसे सामान्य रूप से पहले कभी नहीं देखा है – KDOT

2

set() और get() तरीकों बेमेल नाम/कार्यान्वयन है लगता है।

function get($foo, $bar) { /* ... */ } 
function set($foo) { /* ... */ } 

यह सबसे अधिक संभावना होना चाहिए::

function get($foo) { /* ... */ } 
function set($foo, $bar) { /* ... */ } 

इन गलतियों की संभावना कम करने के लिए, अपने तर्क सार्थक नाम (जैसे $key और $value) देना

कोड आपके द्वारा पोस्ट की इन विधियों है जेनेरिक $foo और $bar के बजाय। फिर स्पॉट करना आसान होगा।

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