在触发事件之前,必须有一个A类的实例,因为您必须注册该事件。唯一的例外是如果您注册了一个静态方法。
假设您有一个用户类应该触发一个事件。首先,您需要一个(抽象)事件分派器类。这种事件系统的工作方式类似于ActionScript3:
abstract class Dispatcher
{
protected $_listeners = array();
public function addEventListener($type, callable $listener)
{
$this->_listeners[$type][] = $listener;
}
public function dispatchEvent(Event $event)
{
if ($this->hasEventListener($event->getType())) {
$listeners = $this->_listeners[$event->getType()];
foreach ($listeners as $callable) {
call_user_func($callable, $event);
}
}
}
public function hasEventListener($type)
{
return (isset($this->_listeners[$type]));
}
}
您的用户类现在可以扩展该调度程序:
class User extends Dispatcher
{
function update()
{
$this->dispatchEvent(new Event('User_update'));
}
}
如何注册该事件呢?假设您有带有 update
方法的 A 类。
$classA = new A();
$user = new User();
$user->addEventListener('User_update', array($classA, 'update'));
$user = new User();
$user->addEventListener('User_update', array('A', 'update'));
如果您有适当的自动加载,可以调用静态方法。
在这两种情况下,
Event
将作为参数发送到
update
方法。如果您愿意,您也可以有一个抽象的
Event
类。