【发布时间】:2011-01-19 21:26:22
【问题描述】:
我正计划研究如何在 PHP 中实现插件架构。我曾尝试在网络上搜索可能的参考资料,但我认为如果我在这里询问,也许我对好的参考资料的搜索会更快、更相关。
这里有没有人尝试过在 Web 项目中使用插件架构?
谢谢, 欧文
【问题讨论】:
标签: php architecture plugins
我正计划研究如何在 PHP 中实现插件架构。我曾尝试在网络上搜索可能的参考资料,但我认为如果我在这里询问,也许我对好的参考资料的搜索会更快、更相关。
这里有没有人尝试过在 Web 项目中使用插件架构?
谢谢, 欧文
【问题讨论】:
标签: php architecture plugins
我已经编写了 wordpress 插件,它们所依赖的魔法是“变量函数名称”。例如这是有效的 php,其中将调用函数调用 phpinfo():
$func_name="phpinfo";
$func_name();
这允许开发人员“挂钩”函数调用,就像在不更改应用程序的其余部分的情况下用自己的函数覆盖它们一样。 Linux 内核模块都是关于“挂钩”的,如果没有这种行为,它们将无法工作。
不幸的是,PHP 变量函数名称是一种令人作呕的 hack,它会消耗大量资源。名称空间中的所有函数都放在一个列表中,并且必须在调用该函数之前搜索该列表,这是 O(log2(n))。还请记住,尽管代码仍将转换为有效的 C++,但在 HipHop 中无法正确加速变量函数名称。更好的方法是像在 python 中那样重新声明函数,这将是 O(1) 复杂度,但是 PHP 开发团队讨厌这个想法(是的,我已经要求这个功能了! )。
祝你好运!
【讨论】:
您可以看看 Zend Framework 如何实现他们的Plugin Loader 组件。
基本上,您将路径设置为存储插件的位置,加载器会尝试加载以 LIFO 方式找到的第一个插件。
【讨论】:
这两个类呢
还有一些规则
例如说 Plugin 类有一个 url_routes 属性,默认值为空数组,子类可以覆盖并添加任何需要的 url 到这个数组中。
Plugin Handler/Loader 会将这些 url 路由从子类添加到底层系统。
【讨论】:
不要忘记函数 __autoload。您可以动态加载组件。 喜欢:
SomeModule::test();
function __autoload($class)
{
$class = preg_replace('/^\W/', '', strtolower($class));
include 'modules/'.$class.'.php';
}
【讨论】:
有很多概念可以被视为“插件”。您可以使用以下方式编写插件系统:
【讨论】: