2015-10-24 4 views
0

ну, это модуль, управляемый событиями. У меня проблемы с созданием нового обработчика, например $ qm-> addEventListener ('add', function ($ x) {$ x = 5;}); а затем $ qm-> addEventListener ('add', function ($ x) {echo $ x;}); как я могу заставить работать что-то вроде этого? он ничего не возвращает.Как я могу заставить функцию работать в модуле, управляемом событиями?

<?php 
class Event { 
    private $eventName; 
    function __construct($eventName){ 
     $this->eventName = $eventName; 
    } 
    public function name() { 
     return $this->eventName; 
    } 
} 
class QueueManager { 
    private $registeredHandlers = array(); 
    public function addEventListener($eventName, $handler) { 
     if (!is_array($this->registeredHandlers[$eventName])) $this->registeredHandlers[$eventName] = array(); 
     $this->registeredHandlers[$eventName][] = $handler; 
    } 
    public function dispatch($event) { 
     $eventName = $event->name(); 
     if (!$this->registeredHandlers[$eventName]) return; 
     foreach ($this->registeredHandlers[$eventName] as $handler) $handler(); 
    } 
} 

$qm = new QueueManager(); 
$qm->addEventListener('click', function(){echo 'ok1';}); //something like this working 
$qm->addEventListener('click', function(){echo 'ok2';}); 
$qm->addEventListener('adding', function($x){$x = 5;}); //something like this not working 
$qm->addEventListener('adding', function($x){$x++;}); 
$qm->addEventListener('adding', function($x){echo $x;}); 
$clickEvent = new Event('click'); 
$qm->dispatch($clickEvent); 
?> 

ответ

1

Трудно, как вам нужно не только передать переменные добавления обработчика событий, но передать по ссылке, а

Вам нужно изменить обратные вызовы событий для обработки вызова по ссылке, а также; затем используя преимущества PHP 5.6:

class Event { 
    private $eventName; 
    function __construct($eventName){ 
     $this->eventName = $eventName; 
    } 
    public function name() { 
     return $this->eventName; 
    } 
} 
class QueueManager { 
    private $registeredHandlers = array(); 
    public function addEventListener($eventName, $handler) { 
     if (!isset($this->registeredHandlers[$eventName]) || !is_array($this->registeredHandlers[$eventName])) $this->registeredHandlers[$eventName] = array(); 
     $this->registeredHandlers[$eventName][] = $handler; 
    } 
    public function dispatch($event, &...$args) { 
     $eventName = $event->name(); 
     if (!$this->registeredHandlers[$eventName]) return; 
     foreach ($this->registeredHandlers[$eventName] as $handler) call_user_func_array($handler, $args); 
    } 
} 

$qm = new QueueManager(); 
$qm->addEventListener('click', function(){echo 'ok1';}); //something like this working 
$qm->addEventListener('click', function(){echo 'ok2';}); 
$qm->addEventListener('adding', function(&$x){$x = 5;}); //something like this not working 
$qm->addEventListener('adding', function(&$x){$x++;}); 
$qm->addEventListener('adding', function($x){echo $x;}); 

$clickEvent = new Event('click'); 
$qm->dispatch($clickEvent); 

$addingEvent = new Event('adding'); 
$value; 
$qm->dispatch($addingEvent, $value); 
Смежные вопросы