没有OOP的观察者模式逻辑?

时间:2010-07-28 18:45:00

标签: php design-patterns observer-pattern

我正在考虑在我的网站上实现类似于观察者模式的逻辑,以实现钩子。

我正在寻找的是类似于Best way to allow plugins for a PHP application

的内容

然而,那里的代码太有限了,因为我无法将多个钩子附加到同一个侦听器。

我对如何放大该代码以使其能够在一个事件中监听多个动作一无所知。

谢谢

3 个答案:

答案 0 :(得分:3)

你可以像ircmaxell建议的那样:添加钩子。但显然,他给出的信息对你来说还不够。

如果您喜欢通过示例学习,您可以查看CMS Drupal,它不是OOP,而是使用观察者模式(称为hooks)来实现模块化设计。

钩子的工作原理如下:

  • 一块php寻找特殊命名函数的存在。
  • 如果存在,请调用它并使用其输出(或不对其执行任何操作)

例如:

  • 在文章保存在Drupal之前,文章系统调用hook_insert
  • 每个具有ModuleName_insert名称功能的模块都会看到被调用的函数。示例:pirate.module可能具有pirate_insert()函数。文章系统沿着所有模块进行往返,并查看ModuleName_insert是否存在。它将通过盗版模块并找到pirate_insert()。然后它将调用该函数(并传递一些参数)。因此,允许pirate.module在插入之前更改文章(或触发一些操作,例如将正文文本转换为海盗版本)。

神奇发生在所谓的user_callbacks中。 An example

$hook = 'insert'
foreach (module_implements($hook) as $module) {
  $function = $module .'_'. $hook;
  $result = call_user_func_array($function, $args);
}

函数module_implements可能类似于:

$list = module_list(FALSE, TRUE, $sort); //looks for files that are considered "modules" or "addons".
foreach ($list as $module) {
  if (function_exists($module.'_'.$hook)) { //see if the module has the hook 'registered'
    $implementations[$hook][] = $module; //if so: add it to a list with functions to be called.
  }
}

答案 1 :(得分:1)

只需添加一个'*'钩子,并修改hook()函数以调用命名事件和'*'事件中的所有'钩子'。

然后,只需:

add_listener('*', 'mycallback');

答案 2 :(得分:0)

看看Spl_Observer

你说你不想要OOP,但你可以很容易地实现非OOP包装。