2016-09-30 3 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 внутри закрытия, я гугле это много раз, но не может найти решение.

+1

Ошибка может быть ошибкой в ​​вашем примере кода, но для меня это похоже на то, 'set' возвращает объект, и' get' устанавливает его. – Andy

ответ

4

Для доступа к внешней переменной из замыкания необходимо использовать ключевое слово use.

Так что:

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

Должно быть написано так: кажется,

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

Блестящий, это сработало! Я рассмотрю использование этого ключевого слова - я никогда не видел этого раньше обычного – KDOT

2

В set() и get() методы вашего DiModule класса имеют несовпадающие имена/реализации.

код вы вывесили имеет следующие методы:

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

Это скорее всего, следует:

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

Чтобы сделать эти ошибки менее вероятно, дают ваши аргументы значимые имена (как $key и $value) вместо общих $foo и $bar. Тогда было бы легче заметить.

Смежные вопросы