插件式开发和系统引导(在线报道 )
今晚的活动本来是应该在昨晚举行的,由于昨晚有点其它事情,所以推迟到今晚,好了,活动马上就了开始了,还有几分钟的时间,先让我来啰嗦几句吧。
看到标题,相信大家都已经期待很久了吧,是的,我们都是这样的,所以才把这问题专门提出来,让小黑同志作为专题给我们讲解。对于什么是插件,插件有什么好处,怎么给自己的系统编写插件,又怎么让别人给我们自己的系统不回插入,这一连串的神秘的又似曾想问的疑问小黑今晚都会给我们一一道来,就让我们今晚一饱眼福吧。
正式开始:
今晚的话题就是插件,插件就是我们编程里的JS一样,我们可以把功能交出客户端去完成,如果我们开发一套系统的话,那么有很多因素都会影响我们的开发。如果我们把一些行为规约制定好,把开发工作让别人去做,效果就会很不一样。
插件原理:
怎么样才能让它工作,我的系统工作的第一步就应该把插件给载入进入,让它能对以后的代码产生影响。换句话来说,一个插件要工作,我们首先应该给它一个引导装载程序,就好比我们的操作系统一样。
我们来模仿LINUX操作系统来给大家淙演示一下。
小黑给大家演示了一个使用插件的例子。。
……Omitted ………
下面是演示代码:
<?php
/**
* 插件式的开发,使用了"注册模式"和"工厂模式"去完成的
* 把风格引导做成插件,载入时调用它
*
* @author 小黑米
* @package plugin
*/
/**
* 注册类
*
*/
class Registry{
/**
* 用于存储注册对象
*
* @var array
*/
private $store = array();
/**
* 检测对象是否存在
*
* @param string $type
* @param string $key
* @return bool
*/
private function isValid($type,$key){
return array_key_exists($key,$this->store[$type]);
}
/**
* 获取已注册对象
*
* @param string $type
* @param string $key
* @return object
*/
public function get($type,$key){
if ($this->isValid($type,$key)) {
return $this->store[$type][$key];
}
}
/**
* 注册对象
*
* @param string $type
* @param string $key
* @param object $obj
*/
public function set($type,$key,$obj){
$this->store[$type][$key] = $obj;
}
/**
* 用于singleton
*
* @return object
*/
public static function getInstance(){
static $instance = array();
if(!$instance)$instance[0] = new Registry();
return $instance[0];
}
}
//模拟插件A B C
class PluginC{
function __construct(){
echo "PluginC被加载了";
}
}
class PluginA{
function __construct(){
echo "PluginA被加载了";
}
}
class PluginB{
function __construct(){
echo "PluginB被加载了";
}
}
/**
* 插件引导类 相当于一个注册插件的工厂,使用工厂模式
*
*/
class PluginFactory{
/**
* 开始引导
*
*/
public function __construct(){
/*查库得出要加载的数组,并把已被加载的插件注册到注册类里面(模拟的情况),
begin是在程序开始的时候加载插件,end是在程序结束前加载插件,这个可能要用到对象模式中的 延迟模式 给个接口 以后方便更改 呵呵!
*/ $plugins = array("begin"=>array("PluginA","PluginC"),"end"=>array("PluginB"));
$reg = Registry::getInstance();
foreach ($plugins as $k => $v){
foreach ($v as $vv){
eval('$reg->set("'.$k.'","'.$vv.'",new '.$vv.'());');
}
}
}
}
new PluginFactory();
//现在插件可以使用了,目前这个算是雏形,要用到实际当中还有很多需要考虑的,演示:周5晚给出
?>
在这里会引入两个设计模式“工厂模式、注册模式”,当然这大家应该都很熟悉了,或者说不陌生,因为我们前段时间专门针对这话题讨论过。
不过对于注册模式还是给大家强调了一上。“注册模式”就相当于我们在函数体内使用global来申明全局变量一样,不过使用注册模式我们这里就能启动global的作用,不过需要我们人为的注册,不然在类内部不能访问未注册的变量。
注册模式最核心的东西是使用一成员变量来保存需要注册的变量。
接下来是一个验证函数,验证该变量是否被注册。
下面为了不创建多个实例,我们使用了一个单键模式来创建对象。
public static function getInstance(){
static $instance = array();
if(!$instance)$instance[0] = new Registry();
return $instance[0];
}
PluginFactory这个类是一个引导装载器。
关键在什么时候调用,一旦程序引导完了以后,那么就通过eval()来动态调用所需要的插件。
一般情况,都会通过eval()来动态装载我们所需要的程序,即,动态创建新的类等操作。
插件的基本制作流程就这样,接下来我们结合smarty来就说smarty类的插件是怎么工作了。
$plugins_dir
插件目录变量
该变量定义Smarty寻找所需插件的目录。默认是在SMARTY目录下的“plugins”目录。如果提供了一个相对路径,Smarty将首先在SMARTY目录下寻找,然后到当前工作目录下寻找,继而到php包含路径中的每个路径中寻找。
接下来是小黑对smarty源码进行解析,这一过程中,听得大家津津有味。
想不到smarty居然还有这么多功能。哎……看来今天收获不小哟。。小黑,一个字“强”。。
今天得演示就到这里了,如果大家有什么不清楚的,可以上小黑博客去和它交流 http://hey-m.phpoo.cn
讲得好啊~~
每次都能收获很多!
真的很感谢小黑~~
谢谢咯~~嘿嘿~~