【发布时间】:2011-03-22 08:10:10
【问题描述】:
我正在考虑在我的网站上实现类似于观察者模式的逻辑,以实现挂钩。
我正在寻找类似于Best way to allow plugins for a PHP application的东西
但是那里的代码太有限了,因为我无法将多个挂钩附加到同一个侦听器。
我不知道如何放大该代码以使其能够在一个事件中侦听多个操作。
谢谢
【问题讨论】:
标签: php design-patterns observer-pattern
我正在考虑在我的网站上实现类似于观察者模式的逻辑,以实现挂钩。
我正在寻找类似于Best way to allow plugins for a PHP application的东西
但是那里的代码太有限了,因为我无法将多个挂钩附加到同一个侦听器。
我不知道如何放大该代码以使其能够在一个事件中侦听多个操作。
谢谢
【问题讨论】:
标签: php design-patterns observer-pattern
您可以按照 ircmaxell 的建议进行操作:添加挂钩。但显然,他提供的信息对你来说还不够。
如果您喜欢通过示例学习,您可以查看 CMS Drupal,它不是 OOP,而是使用观察者模式,在所有地方都称为 hooks,以允许模块化设计。
钩子的工作原理如下:
例如:
魔法发生在所谓的 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.
}
}
【讨论】:
只需添加一个“*”挂钩,并修改hook() 函数以调用命名事件和“*”事件中的所有“挂钩”。
然后,只需这样做:
add_listener('*', 'mycallback');
【讨论】:
. Then, edit the hook()` 函数标识的新钩子来调用所有这些监听器以及指定名称的监听器......
看看Spl_Observer。
您说您不想要 OOP,但您可以轻松实现一个非 OOP 包装器。
【讨论】: