插件式开发和系统引导(在线报道 )
时间: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/
作者: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/
相关阅读 更多 +
排行榜 更多 +