带有事件或挂钩的插件系统?

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 来执行这些回调。

这很好用,但在阅读了一段时间有关该主题的内容后,我仍然不确定该技术是 event- 还是 hook- 系统。

一些消息来源说,差异与松耦合和紧耦合有关。 其他人说 hooks 有 return 值,而 events 没有。其他人再次说事件是为了处理异步 activity,挂钩只是为了在某些时候注入代码。

那么,上面的代码是关于 events 还是 hooks,谁能解释一下区别?

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

Hooks 允许插件与调用它的代码交互。调用它们时假定数据将被返回,并且原始代码通常会在调用挂钩后立即循环遍历返回的数据。

另一方面,

Events 仅在特定操作发生时才被调用以通告。他们让插件有机会 运行 他们自己的事件处理逻辑,而不会以任何方式直接影响原始代码。

Source