php插件体系结构

php插件体系结构,php,plugins,singleton,mediator,Php,Plugins,Singleton,Mediator,我只是在玩php来创建一个插件架构。 为此,我使用事件侦听器(中介器)模式,其中代码可以侦听/触发事件 我真正的问题是如何使侦听器对象在整个应用程序中都可用。” 我现在能想到的唯一解决方案是使核心侦听器/观察者类singleteon,这样来自任何地方的任何代码都可以注册侦听器 $listener = Plugin::getInstance(); $listener->addEventListener('savePost', ....); 对于射击,我也可以使用相同的过程 或 例如,仅将已

我只是在玩php来创建一个插件架构。 为此,我使用事件侦听器(中介器)模式,其中代码可以侦听/触发事件

我真正的问题是如何使侦听器对象在整个应用程序中都可用。” 我现在能想到的唯一解决方案是使核心侦听器/观察者类singleteon,这样来自任何地方的任何代码都可以注册侦听器

$listener = Plugin::getInstance();
$listener->addEventListener('savePost', ....);
对于射击,我也可以使用相同的过程

例如,仅将已注册的事件数组设置为静态

private static $registeredEvents = array();
public function addEventListener($eventName, Closure $c){         
     self::$registeredEvents[$eventName] = $c;
}
如果我这样做,无论插件/侦听器对象如何提供给任何客户机代码 将使用相同的容器($registeredEvents)

否则,向其他对象提供侦听器类的新实例会导致注册事件分散。因此,当从系统触发特定事件时,我不能循环遍历来自不同实例的每个注册事件


请大家给我展示一下更有效的方法

Singleton类和Static$registeredEvents是一种很好的方法 您没有加载内存,因为您只使用静态实例和只分配一个的静态registeredEvents

在PHP中,当您使用对象时,实际上是使用这些对象的指针

您还可以使用注册表(如Zend_注册表)并在注册表中保留唯一的实例

样本:

$registry = Zend_Registry::getInstance();
$registry->set('listener', $listener); // or
// $registry->listener = $listener;
对于加载,您将使用:

// $registry = Zend_Registry::getInstance(); // if needed
$registry->listener->addEventListener();
您还可以将函数设置为静态,甚至不需要实例化,只需使用:

My_Listener_Class::addEventListener();
对于更多的想法,考虑一下这个问题:

http://stackoverflow.com/questions/42/best-way-to-allow-plugins-for-a-php-application

这可能对你有帮助。它包含了一些将插件集成到php中的好方法。

尽管这是一个很晚的回复。谢谢你的信息。我一定会调查zend注册表。