插件系统如何工作(wordpress、mybb ...)?
Posted
技术标签:
【中文标题】插件系统如何工作(wordpress、mybb ...)?【英文标题】:How does plugin system work (wordpress, mybb ...)? 【发布时间】:2011-07-04 21:17:50 【问题描述】:我很好奇插件是如何工作的,我只知道我们使用插件而不是更改代码,但是他们如何在不更改代码的情况下完成工作?编码新项目时应该考虑什么,以便它可以有插件?非常感谢你:D
【问题讨论】:
谢谢你告诉我这件事,因为我以前不知道,谢谢:D 您能分享一下您对这个主题的经验吗?你问这个问题已经有一段时间了。 【参考方案1】:关于如何实现插件系统有多种变化。 Wordpress 使用一种非常常见的方案,通常被称为“钩子”。我不知道确切的实现,但它基本上是这样工作的:
// plugin.php script registers its own callback function
register_plugin("hook_type", "plugin_function_123");
function plugin_function_123($params) ...
hook_type
通常是动作名称或其他东西。当主应用程序运行通过特定点(或例如需要处理一些数据)时,它会调用所有注册的回调函数:
$output = call_plugins("hook_type", $param1, $param2);
这通常在幕后作为一个简单的循环实现:
foreach ($registered_plugins[$action] as $func)
$func($param1, $param2, ...); // or call_user_func_
现在取决于钩子/动作类型存在哪些参数,以及是否需要任何结果文本。参数传递也存在差异(例如,某些回调需要 &$var 引用)。而一些插件系统则依赖于对象(如果不存在那么多不同的动作类型或者要使用更复杂的结构)。
【讨论】:
感谢您的详细回答:D 虽然标记为答案,但能否简单描述一下“它调用所有注册的回调函数”的方式? call_plugins() 函数如何知道钩子“hook_type”附加了哪些操作/过滤器? @WebDevron 在这个相当粗略的例子中,register_*
和 call_plugins()
将共享一个例如全局数组$registered_plugins[]
→ 依次将任何函数/回调关联到标识符(例如“hook_type”)。
感谢您的快速重播。在阅读了您的评论和这个答案 (***.com/a/8336476/2300749) 之后,现在我很清楚它是如何工作的。再次感谢。以上是关于插件系统如何工作(wordpress、mybb ...)?的主要内容,如果未能解决你的问题,请参考以下文章
MYBB 警告 [2] count():参数必须是数组或实现 Countable 的对象 - 行:906