【问题标题】:Instantiate plugins efficiently with observer pattern (php)使用观察者模式 (php) 有效地实例化插件
【发布时间】: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


【解决方案1】:

一个可能的解决方案是使用 __autoload 来捕捉插件被请求的时刻,并根据命名约定将其添加到此时的观察者列表中:

function __autoload($class) {
     include_once 'plugins/' . $class . '.php';
     $observable = substr($class,-16);  # E.g. 'Auth'
     $observable::addObserverClass($class); 
}

然后在 Auth 类中:

class Observable {

   static $observer_classes = array();

   static function addObserverClass($class) {
      self::$observer_classes[] = $class;
   }

   static function addObservers($self) {
      foreach(self::$observer_classes as $class) {
         $self->addObserver($class);
      }
   }

   function addObserver($class) {
      # Add the Observer.
   }
}

class Auth extends Observable {
   function __construct() {
      self::addObservers($self);
   }
}

尚未测试代码,但您应该明白了。它消除了 glob 的需要和每次创建类时迭代每个声明的类的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 2013-10-28
    相关资源
    最近更新 更多