Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/05/2011, 11:43
Nisrokh
 
Fecha de Ingreso: septiembre-2009
Ubicación: Neuquén
Mensajes: 142
Antigüedad: 14 años, 7 meses
Puntos: 12
Pregunta Eventos en PHP

Hola amigos de Foros del Web

Estoy tratando de entender bien el tema de los "Eventos", etc. y queria probar utilizar eventos en PHP, por ejemplo: ejecutar funciones al comenar lectura de datos en una B.D. o al autentificar un usuario, o algo basico como al crear un objecto y al destruirlo...

Hice algo y me funciona bastante bien, pero como todavia estoy aprendiendo del tema me gustaria que me ayuden, deben haber cosas que me faltan o se pueden mejorar...

Busque en Google, etc. pero todos lo explican de formas tan distintas que me confunde, por eso intente hacer un código por cuenta propia para entenderlo mejor.

Les muestro lo que hice...

Me base en 3 clases: Event, Subscriber y Publisher que debe ser extendida por el que va a "disparar" los eventos.
(La clase Object es simplemente un "setter" y "getter" de propiedades)

Código PHP:
Ver original
  1. abstract class Publisher {
  2.    
  3.     private $subscribers = array();
  4.    
  5.     public function __construct() {}
  6.    
  7.     public function subscribe($eventType, $callback, $arguments = null) {
  8.        
  9.         $Subscriber = new Subscriber($eventType, $callback, $arguments);
  10.        
  11.         $this->subscribers[$Subscriber->get('id')] = $Subscriber;
  12.        
  13.         return $Subscriber;
  14.     }
  15.    
  16.     public function unsubscribe(Subscriber $Subscriber) {
  17.        
  18.         $SubscriberID = $Subscriber->get('id');
  19.        
  20.         if (isset($this->subscribers[$SubscriberID])) {
  21.            
  22.             unset($this->subscribers[$SubscriberID]);
  23.         }
  24.     }
  25.    
  26.     public function publish($eventType) {
  27.        
  28.         $Event = new Event($eventType, $this);
  29.        
  30.         foreach ($this->subscribers as $subscriber) {
  31.            
  32.             if ($subscriber->get('eventType') == $eventType) {
  33.                
  34.                 $subscriber->notify($Event);
  35.             }
  36.         }
  37.     }
  38. }

Código PHP:
Ver original
  1. class Subscriber extends Object {
  2.    
  3.     protected $arguments;
  4.    
  5.     protected $callback;
  6.    
  7.     protected $eventType;
  8.    
  9.     protected $id;
  10.    
  11.     public function __construct($eventType, $callback, $arguments = null) {
  12.        
  13.         $id_prefix = 'subscriber-';
  14.         $id = uniqid($id_prefix);
  15.        
  16.         $this->id = $id;
  17.         $this->eventType = $eventType;
  18.         $this->callback = $callback;
  19.         $this->arguments = $arguments === null ? array() : $arguments;
  20.     }
  21.    
  22.     public function __toString() {
  23.        
  24.         return $this->id;
  25.     }
  26.    
  27.     public function notify(Event $Event) {
  28.        
  29.         // Pasar el objeto Event al Subscriber
  30.         array_unshift($this->arguments, $Event);
  31.        
  32.         return call_user_func_array($this->callback, $this->arguments);
  33.     }
  34. }

Código PHP:
Ver original
  1. class Event extends Object {
  2.    
  3.     protected $publisher;
  4.    
  5.     protected $type;
  6.    
  7.     public function __construct($type, Publisher &$Publisher) {
  8.        
  9.         $this->publisher = $Publisher;
  10.         $this->type = $type;
  11.     }
  12. }

Ahora la clases que hace uso de eventos:
Código PHP:
Ver original
  1. class Person extends Publisher {
  2.    
  3.     public function __construct() {
  4.        
  5.         $this->subscribe('sayHello', array(&$this, 'sayHello'));
  6.         $this->subscribe('sayGoodBye', array(&$this, 'sayGoodBye'));
  7.        
  8.         $this->publish('sayHello');
  9.     }
  10.    
  11.     public function __destruct() {
  12.         $this->publish('sayGoodBye');
  13.     }
  14.    
  15.     public function sayHello() {
  16.        
  17.         echo 'Hello!', PHP_EOL;
  18.     }
  19.    
  20.     public function sayGoodBye() {
  21.        
  22.         echo 'Good Bye!', PHP_EOL;
  23.     }
  24. }
  25.  
  26. $Person = new Person;

El resultado es:

Código HTML:
Ver original
  1. Hello!
  2. Good Bye!

¿Hay algo que deberia ser modificado?

Espero sus comentarios
__________________
Amigos de Foros del Web: seamos más solidarios. ¡No dejemos que un tema se valla al final de las páginas con 0 (cero) respuestas! ¡Gracias por su ayuda! :-)