gpt4 book ai didi

php事件系统实现

转载 作者:可可西里 更新时间:2023-10-31 22:55:26 25 4
gpt4 key购买 nike

我想在我的自定义 MVC 框架中实现一个事件系统,以实现解耦需要相互交互的类。基本上,任何类触发事件的能力以及监听此事件的任何其他类都能够挂接到它。

但是,鉴于 php 的无共享架构的性质,我似乎无法找到正确的实现。

例如,假设我有一个用户模型,每次更新时都会触发一个 userUpdate 事件。现在,此事件对类 A(例如)很有用,因为它需要在更新用户时应用自己的逻辑。但是,更新用户时不会加载类 A,因此它无法绑定(bind)到由 User 对象触发的任何事件。

如何避免这种情况?我是不是处理错了?

任何想法将不胜感激

最佳答案

在事件触发之前必须有类A的实例,因为您必须注册该事件。如果您要注册静态方法,则异常(exception)。

假设您有一个应该触发事件的用户类。首先,您需要一个(抽象的)事件调度程序类。这种事件系统的工作方式类似于 ActionScript3:

abstract class Dispatcher
{
protected $_listeners = array();

public function addEventListener($type, callable $listener)
{
// fill $_listeners array
$this->_listeners[$type][] = $listener;
}

public function dispatchEvent(Event $event)
{
// call all listeners and send the event to the callable's
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]));
}
}

您的 User 类现在可以扩展该 Dispatcher:

class User extends Dispatcher
{
function update()
{
// do your update logic

// trigger the event
$this->dispatchEvent(new Event('User_update'));
}
}

以及如何注册该事件?假设您有 A 类,其方法为 update

// non static method
$classA = new A();
$user = new User();
$user->addEventListener('User_update', array($classA, 'update'));

// the method update is static
$user = new User();
$user->addEventListener('User_update', array('A', 'update'));

如果您有适当的自动加载,则可以调用静态方法。在这两种情况下,Event 都将作为参数发送到 update 方法。如果你愿意,你也可以有一个抽象的 Event 类。

关于php事件系统实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20316576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com