2016-09-30 27 views
5

Tôi hiện đang có một module dependency injection cho phép tôi để tạo ra một nhà máy của các đối tượng:Làm thế nào để truy cập vào một vật thể thế giới bên trong một đóng phương pháp

class DiModule 
{ 
    private $Callbacks; 

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

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

sau đó tôi có một đối tượng sự kiện mà các cửa hàng đóng cửa phương pháp và phiên sẽ kích hoạt sự kiện.

Sau đó tôi có đối tượng người nghe tìm kiếm các phiên được đặt và kích hoạt sự kiện được liên kết với đối tượng đó.

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."]; 
    } 
} 

Đây là một ví dụ về điều này được thực hiện

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

Vấn đề là khi tôi cố gắng để truy cập toàn cầu $di của tôi bên trong một kết thúc, tôi đã googled này nhiều lần nhưng không thể tìm thấy một giải pháp.

+1

Chỉ có thể là một sai lầm trong mã mẫu của bạn, nhưng đối với tôi, có vẻ như các phương thức 'DiModule'' set' và 'get' được trộn lẫn. 'set' đang trả về đối tượng và' get' đang thiết lập nó. – Andy

Trả lời

4

Bạn cần sử dụng từ khóa use để truy cập vào biến bên ngoài từ trong phạm vi đóng.

Vì vậy, đây:

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

nên được viết như thế này:

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

Rực rỡ, điều này đã hiệu quả! Tôi sẽ xem xét việc sử dụng từ khóa này - Tôi chưa bao giờ thấy điều này trước đây thông thường – KDOT

2

Các set()get() phương pháp của lớp DiModule của bạn dường như có những cái tên không phù hợp/triển khai.

Mã bạn đã đăng có những phương pháp:

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

Nó rất có thể nên là:

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

Để làm cho những sai lầm ít có khả năng, cung cấp cho lập luận của bạn tên có ý nghĩa (như $key$value) thay vì chung chung $foo$bar. Sau đó, nó sẽ dễ dàng hơn để phát hiện.

Các vấn đề liên quan