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

    今晚的活动本来是应该在昨晚举行的,由于昨晚有点其它事情,所以推迟到今晚,好了,活动马上就了开始了,还有几分钟的时间,先让我来啰嗦几句吧。

    看到标题,相信大家都已经期待很久了吧,是的,我们都是这样的,所以才把这问题专门提出来,让小黑同志作为专题给我们讲解。对于什么是插件,插件有什么好处,怎么给自己的系统编写插件,又怎么让别人给我们自己的系统不回插入,这一连串的神秘的又似曾想问的疑问小黑今晚都会给我们一一道来,就让我们今晚一饱眼福吧。

  正式开始:

  今晚的话题就是插件,插件就是我们编程里的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

 

此条目发表在 phpoo 分类目录,贴了 , 标签。将固定链接加入收藏夹。

插件式开发和系统引导(在线报道 )》有 1 条评论

  1. 小兰儿 说:

    讲得好啊~~
    每次都能收获很多!
    真的很感谢小黑~~
    谢谢咯~~嘿嘿~~

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>