标签归档:插件

由一个插件结构的设置来讨论一下PHP的设计模式

设计模式究竟是个什么东西,被网上炒的沸沸扬扬的。个人觉得,设计模式就是一种可以让你的代码简洁易懂,易于维护的一种方法。
以下是个人的一点儿认识,欢迎拍砖。
最近给CI附加了一个插件的结构,然后晚上翻了一下PHP的设计模式,发现其中貌似应用了这些东西呢。
1.插件本身在程序运行中,只有一个对象存在,存放到$GLOBALS数组中,可以说是单例模式的一种体现。
2.filter和action的处理过程,应用了迭代器模式,每个动作和过滤器的名字对应了一组回调,放到一个优先队列的对象当中,然后执行的时候,运用foreach依次循环这些回调,如果某一个回调返回了false,那么就用break跳出整个循环了。
3.插件动作的触发应用了观察者模式。
代码执行过程中会发起相应的信号给插件来,插件来来根据这个信号,来执行相应的插件动作,就是观察者模式了吧
4.整个过程是一个依赖注入的模式。
由插件代码,向主程序流中注入代码。

php插件方式的一个简单实现

插件式的结构是一个很不错的结构,整个wordpress就是一个很不错的插件结构。
归跟到底,整个wordpress中的代码都是do_action,apply_fiter,在插件中是用add_action,和add_fiter来注册插件代码。
所以,实现一个插件结构的程序,实现这几个函数就可以了。
首先定义一个插件的目录,本段代码在plugin.php所在目录的plugins目录中,扫描其中所有的php文件,执行其中的代码完成部分插件代码的注册。
如果文件夹中包含目录,那么进入该目录,查找与该目录同名的php文件,包含执行。这样就完成了所有的插件代码注册。

<?php if(!defined('PLUGIN')) {
	define('PLUGIN', true);
	
	class plugin {
		
		public $actions;
		public $filters; 
		
		private $plugin_dir;
		
		private static $instance;
		
		public static function getInstance() {
			if(self::$instance == NULL) {
				self::$instance = new plugin();
			}
			return self::$instance;
		}
		
		private  function __construct() {
			$this->actions = $this->filters = array();
			$this->plugin_dir = dirname(__FILE__) . "/plugins/";
		}
		
		public function init(){
			
			$dir_handle = opendir($this->plugin_dir);
			while( $m = readdir($dir_handle)) {
				if($m == "." || $m == "..") {
					continue;
				} else {
					$n = $this->plugin_dir . $m;
					if(is_file($n)) {
						$f = $n;
					}else{
						$f = $n . "/" . $m . ".php";
					}
					include $f;
				}
			}
			closedir($dir_handle);
		}
		
		public function do_action($action,$params = array()) {
			$a = $this->actions[$action];
			$c = $a;
			if(is_callable($c)){
				call_user_func_array($c, $params);
			}
		}
		
		public function add_action($action,$callable) {
			$this->actions[$action] = $callable;
		}
		
		public function add_filter($filter,$callable) {
			$this->filters[$filter] = $callable;
		}
		
		public function apply_filter($filter,$params = array()) {
			$c = $this->filters[$filter];
			if(is_callable($c)){
				call_user_func_array($c, $params);
			}
		}
		
		
	}
	
}

一段包含了插件结果的代码:

<?php
	include 'plugin.php';
	
	global 	$pl;
	 
	$pl	= plugin::getInstance();
	
	$pl->init();

	$pl->do_action("hello", array(0,1,2,3));
	
	$pl->do_action("world", array(0,1,2,3));
	
	
	echo "<p>__________________________________________________________________________________</p>";
	
	$n = array();
	
    $pl->apply_filter('hello',array(&$n));
    
    echo "<p>__________________________________________________________________________________</p>";

    var_dump($n);
    

用jquery实现下拉列表的联动

相信很多人应该见过这样一个东西:

界面中有两个下拉框A和B就是这样一个东西,当点击第一个下拉框A时,第二个下拉框B随之变化。
实现思路是这个样子的。
首先根据第一个下拉框的id,选择出该对象,也就是传说中的ID选择器,$(‘#first’)。接着绑定一个change事件,$(‘#first’).change(function(){});
然后就可以在实现函数中写入实现函数,传说中的ajax。
常用的配置项有如下几项:url是请求的url,type是请求的类型分为get和post(二者的区别就不说了),data是发送到服务器上的数据,success是访问成功以后执行的函数。
成功以后,将下一个下拉框(ID为second)中的内容改变。
为操作方便,将服务器端返回json格式的数组。然后js可以利用eval将该字符串转化成数组。然后遍历该数组,组合成新的html字符串,赋值给第二个文本框中的html属性即可。
以上思路写出来的代码大致应该是这样的: 继续阅读