文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>插件式开发和系统引导(在线报道 )

插件式开发和系统引导(在线报道 )

时间:2007-10-26  来源:lib

插件式开发和系统引导(在线报道 )
作者:hqlong 日期:2007-06-30
    今晚的活动本来是应该在昨晚举行的,由于昨晚有点其它事情,所以推迟到今晚,好了,活动马上就了开始了,还有几分钟的时间,先让我来啰嗦几句吧。
   
看到标题,相信大家都已经期待很久了吧,是的,我们都是这样的,所以才把这问题专门提出来,让小黑同志作为专题给我们讲解。对于什么是插件,插件有什么好
处,怎么给自己的系统编写插件,又怎么让别人给我们自己的系统不回插入,这一连串的神秘的又似曾想问的疑问小黑今晚都会给我们一一道来,就让我们今晚一饱
眼福吧。
  正式开始:
  今晚的话题就是插件,插件就是我们编程里的JS一样,我们可以把功能交出客户端去完成,如果我们开发一套系统的话,那么有很多因素都会影响我们的开发。如果我们把一些行为规约制定好,把开发工作让别人去做,效果就会很不一样。
插件原理:
怎么样才能让它工作,我的系统工作的第一步就应该把插件给载入进入,让它能对以后的代码产生影响。换句话来说,一个插件要工作,我们首先应该给它一个引导装载程序,就好比我们的操作系统一样。
我们来模仿LINUX操作系统来给大家淙演示一下。
小黑给大家演示了一个使用插件的例子。。
……Omitted ………
下面是演示代码:

[color="#000000"]store[color="#000000"][$type[color="#000000"]]);
        }[color="#008000"]
        /**
         * 获取已注册对象
         *
         * @param string $type
         * @param string $key
         * @return object
         */[color="#0000ff"]
        public function get[color="#000000"]($type[color="#000000"],$key[color="#000000"]){[color="#0000ff"]
                if[color="#000000"] ($[color="#0000ff"]this[color="#000000"]->isValid[color="#000000"]($type[color="#000000"],$key[color="#000000"])) {[color="#0000ff"]
                        return $[color="#0000ff"]this[color="#000000"]->store[color="#000000"][$type[color="#000000"]][$key[color="#000000"]];
                }
        }[color="#008000"]
        /**
         * 注册对象
         *
         * @param string $type
         * @param string $key
         * @param object $obj
         */[color="#0000ff"]
        public function set[color="#000000"]($type[color="#000000"],$key[color="#000000"],$obj[color="#000000"]){
                $[color="#0000ff"]this[color="#000000"]->store[color="#000000"][$type[color="#000000"]][$key[color="#000000"]] = $obj[color="#000000"];
        }[color="#008000"]
        /**
         * 用于singleton
         *
         * @return object
         */[color="#0000ff"]
        public static function getInstance[color="#000000"](){[color="#0000ff"]
                static $instance[color="#000000"] = array[color="#000000"]();[color="#0000ff"]
                if[color="#000000"](!$instance[color="#000000"])$instance[color="#000000"][[color="#800080"]0[color="#000000"]] =[color="#0000ff"] new Registry[color="#000000"]();[color="#0000ff"]
                return $instance[color="#000000"][[color="#800080"]0[color="#000000"]];
        }
}[color="#008000"]
//模拟插件A B C
[color="#0000ff"]class PluginC[color="#000000"]{
        function __construct[color="#000000"](){
                echo[color="#ff00ff"] "PluginC被加载了"[color="#000000"];
        }
}[color="#0000ff"]
class PluginA[color="#000000"]{
        function __construct[color="#000000"](){
                echo[color="#ff00ff"] "PluginA被加载了"[color="#000000"];
        }
}[color="#0000ff"]
class PluginB[color="#000000"]{
        function __construct[color="#000000"](){
                echo[color="#ff00ff"] "PluginB被加载了"[color="#000000"];
        }
}[color="#008000"]
/**
* 插件引导类 相当于一个注册插件的工厂,使用工厂模式
*
*/[color="#0000ff"]
class PluginFactory[color="#000000"]{[color="#008000"]
        /**
         * 开始引导
         *
         */[color="#0000ff"]
        public function __construct[color="#000000"](){[color="#008000"]
                /*查库得出要加载的数组,并把已被加载的插件注册到注册类里面(模拟的情况),
begin是在程序开始的时候加载插件,[color="#008000"]end是在程序结束前加载插件,这个可能要用到对象模式中的 延迟模式 给个接口 以后方便更改 呵呵!
*/                $plugins[color="#000000"] = array[color="#000000"]([color="#ff00ff"]"begin"[color="#000000"]=>array[color="#000000"]([color="#ff00ff"]"PluginA"[color="#000000"],[color="#ff00ff"]"PluginC"[color="#000000"]),[color="#ff00ff"]"end"[color="#000000"]=>array[color="#000000"]([color="#ff00ff"]"PluginB"[color="#000000"]));
                $reg[color="#000000"] = Registry[color="#000000"]::getInstance[color="#000000"]();
                foreach[color="#000000"] ($plugins as $k[color="#000000"] => $v[color="#000000"]){
                        foreach[color="#000000"] ($v as $vv[color="#000000"]){
                                eval[color="#000000"]([color="#0000ff"]'$reg->set("'[color="#000000"].$k[color="#000000"].[color="#0000ff"]'","'[color="#000000"].$vv[color="#000000"].[color="#0000ff"]'",new '[color="#000000"].$vv[color="#000000"].[color="#0000ff"]'());'[color="#000000"]);
                        }
                }
        }
}[color="#0000ff"]
new PluginFactory[color="#000000"]();[color="#008000"]
//现在插件可以使用了,目前这个算是雏形,要用到实际当中还有很多需要考虑的,演示:周5晚给出
[color="#000000"]?>
在这里会引入两个设计模式“工厂模式、注册模式”,当然这大家应该都很熟悉了,或者说不陌生,因为我们前段时间专门针对这话题讨论过。
不过对于注册模式还是给大家强调了一上。“注册模式”就相当于我们在函数体内使用global来申明全局变量一样,不过使用注册模式我们这里就能启动global的作用,不过需要我们人为的注册,不然在类内部不能访问未注册的变量。
注册模式最核心的东西是使用一成员变量来保存需要注册的变量。
接下来是一个验证函数,验证该变量是否被注册。
下面为了不创建多个实例,我们使用了一个单键模式来创建对象。

[color="#0000ff"]        public static function getInstance[color="#000000"](){[color="#0000ff"]
                static $instance[color="#000000"] = array[color="#000000"]();[color="#0000ff"]
                if[color="#000000"](!$instance[color="#000000"])$instance[color="#000000"][[color="#800080"]0[color="#000000"]] =[color="#0000ff"] new Registry[color="#000000"]();[color="#0000ff"]
                return $instance[color="#000000"][[color="#800080"]0[color="#000000"]];
        }
PluginFactory这个类是一个引导装载器。
关键在什么时候调用,一旦程序引导完了以后,那么就通过eval()来动态调用所需要的插件。
一般情况,都会通过eval()来动态装载我们所需要的程序,即,动态创建新的类等操作。

插件的基本制作流程就这样,接下来我们结合smarty来就说smarty类的插件是怎么工作了。

$plugins_dir
插件目录变量

该变量定义Smarty寻找所需插件的目录。默认是在SMARTY目录下的“plugins”目录。如果提供了一个相对路径,Smarty将首先在SMARTY目录下寻找,然后到当前工作目录下寻找,继而到php包含路径中的每个路径中寻找。
接下来是小黑对smarty源码进行解析,这一过程中,听得大家津津有味。
想不到smarty居然还有这么多功能。哎……看来今天收获不小哟。。小黑,一个字“强”。。
今天得演示就到这里了,如果大家有什么不清楚的,可以上小黑博客去和它交流
http://hey-m.phpoo.cn
from http://hqlong.phpoo.cn/
               
               
               

相关阅读 更多 +
排行榜 更多 +
模拟梦幻人生 v2.0.1 安卓版

模拟梦幻人生 v2.0.1 安卓版

飞行射击 下载
模拟梦幻人生 v2.0.1 安卓版

模拟梦幻人生 v2.0.1 安卓版

飞行射击 下载
模拟梦幻人生 v2.0.1 安卓版

模拟梦幻人生 v2.0.1 安卓版

飞行射击 下载