PHP中的插件架构

5

我打算研究如何在PHP中实现插件架构。我试图在网上寻找可能的参考资料,但我认为如果在这里询问,我的寻找好的参考资料的速度会更快、更相关。

有没有人在Web项目中尝试过使用插件架构?

谢谢, Erwin

5个回答

4

我已经编写过WordPress插件,它们依赖于“可变函数名称”这种魔法。例如,以下代码是有效的php代码,其中将调用函数调用phpinfo():

$func_name="phpinfo";
$func_name();

这使得开发人员可以“挂钩”函数调用,即使用自己的函数覆盖它们,而无需更改应用程序的其余部分。Linux内核模块都是关于“挂钩”的,如果没有这种行为,它们就无法工作。

不幸的是,对于PHP来说,可变函数名是一种令人讨厌的hack,会消耗大量资源。命名空间中的所有函数都被放在一个列表中,必须在调用函数之前搜索该列表,这是O(log2(n))。此外,请记住,虽然可以将代码转换为有效的C++,但HipHop无法正确加速可变函数名。更好的方法是重新声明函数,就像您可以在Python中做的那样,这将是O(1)复杂度,但是PHP开发团队非常讨厌这个想法(是的,我已经提出了这个功能的要求!)。

祝你好运!


3
在我看来,这是一种可怕的方法。 - davr
@davr:为什么?只要明确说明并记录下来,而且清楚它是正确的行为,那就完全没问题。类比一下,这就像C#中的委托一样。 - Luiz Damim
5
如果您能提出更好的解决方案,整个PHP社区都会很乐意听取。 - rook
其实,有时候我会在代码中使用变量函数名,如果需要的话。我不知道当涉及到插件架构时它也会很有用。谢谢大家提供的信息。@davr 我只是好奇,你是否有其他关于如何在PHP中实现这种架构的建议? - Erwin

1

有很多概念可以被认为是“插件”。你可以使用以下方式编写插件系统:


0

别忘了函数__autoload,你可以动态地加载组件,例如:

SomeModule::test();

function __autoload($class)
{
   $class = preg_replace('/^\W/', '', strtolower($class));
   include 'modules/'.$class.'.php';
}

0
你可以看一下Zend Framework是如何实现他们的插件加载器组件的。
基本上,你需要设置存储插件的路径,然后加载器会以LIFO的方式尝试加载第一个找到的插件。

0

这两个类是什么?

  1. 插件处理程序/加载器
  2. 插件

并且有一些规则:

  1. 插件处理程序/加载器是一个单例类,管理所有Plugin类的子类。
  2. 任何插件都必须从Plugin类继承。
  3. Plugin类将具有预定义的属性和方法,可以被其子类覆盖,因此可以使用替代方法来挂钩系统(但我不确定结果是否有任何主要区别)。

例如,假设Plugin类具有url_routes属性,默认值为空数组,则子类可以覆盖并在此数组中添加任何所需的URL。

然后,插件处理程序/加载器将从子类中添加这些URL路由到底层系统中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接