综上而言,如下的说明能够用于创建一个新的事件:
1. 创建一个EventObject 类的子类,用于给事件数据提供监听。通常命名为包含事件名称和”event”结尾,就像ProtocolCommandEvent。这样你以后可以重新使用已经存在的类甚至事件对象本身。
2. 创建或继承一个用于实现监听的接口。通常接口名称以“Listener”结尾并且包含1个或更多的被事件生成调用的函数,并且有一个符合对应的事件对象子集的自变量。
3. 添加 “add<EventName>Listener(<EventName>Listener)” and “fire<EventName>()” 方法在事件生成器中. 任意的, 添加“remove<EventName>Listener(<EventName>Listener)”如果你想要移除监听。这些方法通过完善的训练,可以省略掉。
4. 在你想要创建事件的代码中引入“fire<EventName>()”方法。这种方法可以被用于多种环境中例如,DatabaseError事件在数据库联接不能被创建或者查询失败的时候发生。
The PHP event implementation requires two related classes to be defined and included into the PHP project: EventObject and ListenerList, as follows:
PHP事件处理实现需要包含2个相关类在PHP工程里:EventObject and ListenerList就象下面的实例
class EventObject {
protected $source;
function __construct($source) {
$this->source = $source;
}
function getSource() {
return $this->source;
}
}
class ListenerList {
protected $listeners = array();
function add($listener) {
$this->listeners[] = $listener;
}
function getRaw() {
return $this->listeners;
}
}
让我们来创建一个简单的用于产生事件并且同时进行监听的类。听起来满困难的,但是却是常被使用的技术
interface MyEventListener {
function onMyEvent(EventObject $event);
}
class MyClass implements MyEventListener {
protected $listeners;
function __construct() {
$this->listeners = new ListenerList();
$this->addMyEventListener($this);
}
function addMyEventListener(MyEventListener $listener) {
$this->listeners->add($listener);
}
function work() {
echo "Working!\n";
$this->fireMyEvent();
echo "Working!\n";
$this->fireMyEvent();
echo "Working!\n";
}
protected function fireMyEvent() {
$event = new EventObject($this);
foreach ($this->listeners->getRaw() as $listener) {
$listener->onMyEvent($event);
}
}
function onMyEvent(EventObject $event) {
echo "Taking short break...\n";
}
}
$object = new MyClass();
$object->work();
// Will print:
// Working!
// Taking short break...
// Working!
// Taking short break...
// Working!
使用事件描述模式,可以增进你的代码的稳定性,但是要注意的是他要在你的代码中添加很多接口和事件类,这样比没使用前执行要慢。