【发布时间】:2011-10-02 03:54:45
【问题描述】:
我正在为所有插件实现观察者模式以与我的网络应用程序交互。现在,我想像大多数网络应用一样轻松安装插件(即将文件放入插件文件夹)。
例如: 一个名为“Awesome Stuff”的插件根据 Auth 类和 Content 类中发生的事件执行代码,将在“/plugin”目录中包含以下文件。 AwesomeStuffAuth.php AwesomeStuffContent.php
我有一个可行的解决方案,但恐怕它效率不高,因为它必须循环遍历所有声明的类,然后才能真正找到它正在寻找的东西。
function __construct() {
//Get files in plugin directory that work on Auth
foreach (glob("plugins/*AuthPlugin.php") as $filename) {
//Include'em
include_once($filename);
}
//Get all declared classes
foreach (get_declared_classes() as $class){
if (substr($class,-10)=='AuthPlugin'){
$obj = new $class;
$this->addObserver($obj);
}
}
}
这是我在 Auth 类中使用的 __construct() 方法,其他类也有类似的方法。
这是一种有效的方法吗? 值得我连接到数据库以避免循环遍历所有声明的类吗?平面文件怎么样?
非常感谢您查看此内容。
【问题讨论】:
-
为什么在
Awesome Stuff的文件名中包含Auth? -
插件将如何操作 auth 对象?我试图了解您为什么不创建扩展原始 Auth 类的 AwesomeStuffAuth 类。你能描述一个不起作用的情况吗?您的示例非常小,我看不出您将如何与插件交互。
-
@JaredFarrish ,所以应用程序知道插件正在操纵汽车类
-
@stereofrog 好消息,那些包含并使用 glob 搜索文件系统怎么样
-
@Dan 我正在实现观察者模式,这意味着我“addObservers”然后在某些事件发生时通知他们(比如成功或不成功的登录),此时观察者对象将会或将会不执行一些代码。我知道这不是太清楚,但快速谷歌会阐明这一切。
标签: php oop design-patterns observer-pattern