带有事件或钩子的插件系统


Plugin system with events or hooks?

>我已经为php软件创建了一个插件系统。为了让插件改变程序的行为,我写了这个(简化的)代码:

class PluginController {
  /* ... */
  public function addHook($name, $function, $priority = 10) {
    /* store the function callback $function  associated with $name */
  }
  public function executeHook($name, $args = array()) {
    /* execute all function callbacks associated with $name
     * in order of their priority and return their results */    
  }
}

因此,插件可以使用addHook添加回调,并且在应用程序中的某个地方,这些回调通过调用executeHook来执行。

这效果很好,但是在阅读了有关该主题的一些时间后,我仍然不确定这种技术是事件系统还是钩子系统。

一些消息来源说,这种差异与松动和紧密的耦合有关。其他人说钩子有返回值,而事件没有。其他人再次说事件是用于手动异步活动的,钩子只是为了在某个时候注入代码。

那么再说一次,上面的代码是关于事件还是钩子,有人可以解释一下其中的区别吗?

你的代码更像是一个事件。

钩子允许插件与调用它的代码进行交互。调用它们时假设将返回数据,并且原始代码通常会在调用钩子后立即遍历返回的数据。

另一方面,调用事件只是为了宣布特定操作何时发生。它们使插件有机会在这一点上运行自己的事件处理逻辑,而不会以任何方式直接影响原始代码。