【发布时间】:2011-07-04 21:17:50
【问题描述】:
我很好奇插件是如何工作的,我只知道我们使用插件而不是更改代码,但是他们如何在不更改代码的情况下完成工作?编码新项目时应该考虑什么,以便它可以有插件?非常感谢你:D
【问题讨论】:
-
谢谢你告诉我这件事,因为我以前不知道,谢谢:D
-
您能分享一下您对这个主题的经验吗?你问这个问题已经有一段时间了。
我很好奇插件是如何工作的,我只知道我们使用插件而不是更改代码,但是他们如何在不更改代码的情况下完成工作?编码新项目时应该考虑什么,以便它可以有插件?非常感谢你:D
【问题讨论】:
关于如何实现插件系统有多种变化。 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 引用)。而一些插件系统则依赖于对象(如果不存在那么多不同的动作类型或者要使用更复杂的结构)。
【讨论】:
register_* 和 call_plugins() 将共享一个例如全局数组$registered_plugins[] → 依次将任何函数/回调关联到标识符(例如“hook_type”)。