|
|
1
155
您可以使用观察者模式。实现这一点的简单实用方法:
输出:
笔记: 对于这个示例源代码,您必须在要扩展的实际源代码之前声明所有插件。我已经包含了一个如何处理传递给插件的单个或多个值的示例。最困难的部分是编写实际的文档,其中列出了传递给每个钩子的参数。 这只是用PHP实现插件系统的一种方法。有更好的选择,我建议您查看WordPress文档了解更多信息。 抱歉,下划线字符被HTML实体替换为标记?当这个bug被修复时,我可以重新发布这个代码。 编辑:不必担心,只有在编辑时才会出现这种情况。 |
|
|
2
54
因此,假设您不希望使用观察者模式,因为它要求您更改类方法来处理监听任务,并且需要一些通用的东西。假设你不想使用
在第1部分中,您可以在
在第2部分中,这就是我们加载类的地方。注意,我不必对这个类做任何特殊的事情,这与观察者模式有很大的不同。
在第3部分中,我们将类转换为“可插入”(即,支持允许我们重写类方法和属性的插件)。例如,如果你有一个web应用,你可能有一个插件注册表,你可以在这里激活插件。也注意
在第4部分中,这是正常的操作代码,但是请注意,您可能认为运行的代码根本不会像这样运行。例如,狗没有宣布它的名字为“fido”,而是“coco”。狗不叫“喵”,而是叫“呜”。当你事后想看看狗的名字时,你会发现它是“不同的”,而不是“可可”。所有这些覆盖都在第3部分中提供。
那么这是如何工作的呢?好吧,让我们排除
|
|
|
3
34
这个 钩 和 听众 方法是最常用的方法,但还有其他一些事情可以做。取决于你的应用程序的大小,以及你允许谁查看代码(这将是一个FOSS脚本,还是内部的东西)将极大地影响你允许插件的方式。 Kdeloach有一个很好的例子,但是他的实现和钩子函数有点不安全。我想请你提供更多关于你所写的PHP应用程序的性质以及你如何看待插件的信息。 +从我这里离开。 |
|
|
4
21
这是我使用的一种方法,它尝试从qt信号/槽机制复制,一种观察模式。 对象可以发出信号。 每个信号在系统中都有一个ID-它由发送者的ID+对象名组成 每个信号都可以绑定到接收器上,这只是一个“可调用的” 你用总线类把信号传递给任何有兴趣接收信号的人 当事情发生时,你会“发送”一个信号。 下面是和示例实现
|
|
|
5
17
我认为最简单的方法是遵循Jeff自己的建议并查看现有代码。试试看WordPress、Drupal、Joomla和其他著名的基于PHP的CMS,看看它们的API钩子的外观和感觉如何。这样你甚至可以得到你以前没有想到过的想法,让事情变得更加浮夸。 一个更直接的答案是将他们“包含一次”的常规文件写入他们的文件中,从而提供他们需要的可用性。这将分为多个类别,而不是在一个大的“hooks.php”文件中提供。但是要小心,因为最终会发生的是,它们所包含的文件最终会有越来越多的依赖性和功能性得到改善。尽量降低API依赖性。也就是说,要包含的文件更少。 |
|
6
14
有一个叫 Stickleback 雅虎的Matt Zandstra负责处理PHP插件的大部分工作。 它强制执行插件类的接口,支持命令行接口,并且不太难启动和运行-特别是如果您在 PHP architect magazine . |
|
|
7
10
好的建议是看看其他项目是如何完成的。许多人要求安装插件,并为服务注册插件的“名称”(如WordPress),这样您的代码中就有了“点”,您可以在其中调用一个函数来标识注册的侦听器并执行它们。标准的OO设计模式是 Observer Pattern 这将是在真正面向对象的PHP系统中实现的一个很好的选择。 这个 Zend Framework 使用了许多挂钩方法,并且架构非常好。这将是一个很好的系统。 |
|
|
8
7
我很惊讶,这里的大多数答案似乎都是针对Web应用程序本地的插件,即运行在本地Web服务器上的插件。 如果你想让插件在不同的远程服务器上运行呢?最好的方法是提供一个表单,允许您定义在应用程序中发生特定事件时调用的不同URL。 不同的事件将根据刚刚发生的事件发送不同的信息。 通过这种方式,您只需对已提供给应用程序的URL执行curl调用(例如通过https),远程服务器可以根据应用程序发送的信息执行任务。 这提供了两个好处:
|