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
abstract class Publisher { public function __construct() {} public function subscribe($eventType, $callback, $arguments = null) { $Subscriber = new Subscriber($eventType, $callback, $arguments); $this->subscribers[$Subscriber->get('id')] = $Subscriber; return $Subscriber; } public function unsubscribe(Subscriber $Subscriber) { $SubscriberID = $Subscriber->get('id'); } } public function publish($eventType) { $Event = new Event($eventType, $this); foreach ($this->subscribers as $subscriber) { if ($subscriber->get('eventType') == $eventType) { $subscriber->notify($Event); } } } }
Código PHP:
Ver original
class Subscriber extends Object { protected $arguments; protected $callback; protected $eventType; protected $id; public function __construct($eventType, $callback, $arguments = null) { $id_prefix = 'subscriber-'; $this->id = $id; $this->eventType = $eventType; $this->callback = $callback; } public function __toString() { return $this->id; } public function notify(Event $Event) { // Pasar el objeto Event al Subscriber } }
Código PHP:
Ver original
class Event extends Object { protected $publisher; protected $type; public function __construct($type, Publisher &$Publisher) { $this->publisher = $Publisher; $this->type = $type; } }
Ahora la clases que hace uso de eventos:
Código PHP:
Ver original
class Person extends Publisher { public function __construct() { $this->publish('sayHello'); } public function __destruct() { $this->publish('sayGoodBye'); } public function sayHello() { echo 'Hello!', PHP_EOL; } public function sayGoodBye() { echo 'Good Bye!', PHP_EOL; } } $Person = new Person;
El resultado es:
Código HTML:
Ver original
Hello! Good Bye!
¿Hay algo que deberia ser modificado?
Espero sus comentarios