PHP下用B/S编程模式去实现C/S软件编程模式下的插件引擎功能!

[php] view plaincopyPHP下用B/S编程模式去实现C/S软件编程模式下的插件引擎功能!PHP下用B/S编程模式去实现C/S软件编程模式下的插件引擎功能!

创新互联建站主营共青城网站建设的网络公司,主营网站建设方案,成都app软件开发,共青城h5微信小程序开发搭建,共青城网站营销推广欢迎共青城等地区企业咨询

  1. /** 

  2.  * 摘取天上星 版 插件引擎 第二版 version 2.0   

  3.  * By: 摘取天上星! 

  4.  * Emali: happy.yin@qq.com 

  5.  * Date: 2012升级版 

  6.  **/  

  7.   $plugin_arr=array();  

  8.   $plugin_meta=array();  

  9.   $plugin_remove=array();  

  10.   $action_arr=array();  

  11.   $action_meta=array();  

  12.   $action_remove=array();  

  13.   $idx=0;  

  14.   /* 

  15.    * 执行插件引擎中捆绑的所有函数事件(函数执行顺序参加addPlugin函数添加插件时的第四个参数数字,数字越大优先级越高) 

  16.    * $tag 要执行的函数集插件标签名 

  17.    * $args 要往函数中传入的参数,依次按顺序填写,键名同addPlugin添加插件时第三个参数传入的键名、数量对应一致,键名对应的值即传入的参数值, 

  18.    * 该插件引擎是有返回值的插件引擎 

  19.    */  

  20.   function doPlugin($tag,$args=array()){  

  21.     global $plugin_arr,$plugin_remove;  

  22.     $first=array_search(current($args),$args);  

  23.     if(empty($plugin_arr[$tag])) return $args[$first];  

  24.     if(isset($plugin_remove[$tag])){  

  25.         foreach($plugin_remove[$tag] as $func){  

  26.             removePlugin($tag,$func);  

  27.         }  

  28.     }  

  29.     krsort($plugin_arr[$tag]);  

  30.     foreach($plugin_arr[$tag] as $plugins){  

  31.         foreach($plugins as $plugins){  

  32.             $plugins['args']=array_merge($plugins['args'],$args);  

  33.             $args[$first]=call_user_func_array($plugins['func'],array_slice($plugins['args'],0,$plugins['args_count']));  

  34.         }  

  35.     }  

  36.     return $args[$first];  

  37.   }  

  38.   /* 第一个参数为自定义标签集名, 

  39.    * 第二个参数是你要向标签集里添加的函数名, 

  40.    * 第三个数组参数为第二个参数strAndStr1函数对应的参数集,有多少个函数参数,就需要添加多少个数组元素, 

  41.            参数按照先后顺序依次填写,键值为空即可,且插件里所有函数的参数个数必须一致,一个以上的参数,可多个, 

  42.            这里的传参数组只需要预写好键名即可,在调用doPlugin插件时给对应的键值传入键名对应的实际参数值即可 

  43.    * 第四个参数为排序参数,从1到10的纯数字,数值越大执行优先级越高,反之越小,默认为值为最大优先级10 

  44.    * addPlugin('cleanText','strAndStr1',array('str'=>'','str2'=>''),1);   

  45.    * addPlugin('cleanText','strAndStr2',array('str'=>'','str2'=>''),2);  

  46.    */  

  47.   function addPlugin($tag,$func,$args=array(),$sort=10){  

  48.     global $plugin_arr,$plugin_meta,$idx;  

  49.     $plugin_arr[$tag][$sort][++$idx]=array('func'=>$func,'args'=>$args,'args_count'=>sizeof($args));  

  50.     $plugin_meta[$tag][$func][$idx]=$sort;  

  51.   }  

  52.   /* 

  53.    * 立即删除函数集标签中 的某个函数 

  54.    * 第一个参数为自定义函数集标签名称 

  55.    * 第二个参数为要从函数集里 删除的单个函数名称 

  56.    */  

  57.   function removePlugin($tag,$func){  

  58.     global $plugin_arr,$plugin_meta;  

  59.     if(isset($plugin_meta[$tag][$func])){  

  60.         foreach($plugin_meta[$tag][$func] as $idx=>$sort){  

  61.             unset($plugin_arr[$tag][$sort][$idx]);  

  62.         }  

  63.         unset($plugin_meta[$tag][$func]);  

  64.     }  

  65.   }  

  66.   /* 

  67.    * 在下次执行doPlugin时删除函数集标签中 的某个函数(在doPlugin中的插件函数执行前删除,并且删除后执行插件引擎!) 

  68.    * 第一个参数为自定义函数集标签名称 

  69.    * 第二个参数为要从函数集里 删除的单个函数名称 

  70.    */  

  71.   function addRemovePlugin($tag,$func){  

  72.     global $plugin_remove;  

  73.     if(in_array($func,(array)$plugin_remove[$tag])) return ;  

  74.     $plugin_remove[$tag][]=$func;  

  75.   }  

  76.   /* 

  77.    * 如下执行插件方法同上述有返回值的执行插件使用方法对应一致, 

  78.    * 唯一的区别是没有返回值 

  79.    */  

  80.   /* 

  81.    * 执行插件引擎 

  82.    */  

  83.   function doAction($tag,$args=array()){  

  84.     global  $action_arr,$action_remove;  

  85.     if(empty($action_arr[$tag])) return ;  

  86.     if(isset($action_remove[$tag])){  

  87.         foreach($action_remove[$tag] as $func){  

  88.             removeAction($tag,$func);  

  89.         }  

  90.     }  

  91.     krsort($action_arr[$tag]);  

  92.     foreach($action_arr[$tag] as $action_sort){  

  93.         foreach($action_sort as $action_idx){  

  94.             $action_idx['args']=array_merge($action_idx['args'],$args);  

  95.             call_user_func_array($action_idx['func'],array_slice($action_idx['args'],0,$action_idx['args_count']));  

  96.         }  

  97.     }  

  98.   }  

  99.   /* 

  100.    * 向插件引擎里添加函数 

  101.    */  

  102.   function addAction($tag,$func,$args=array(),$sort=10){  

  103.     global $action_arr,$action_meta,$idx;  

  104.     $action_arr[$tag][$sort][++$idx]=array('func'=>$func,'args'=>$args,'args_count'=>sizeof($args));  

  105.     $action_meta[$tag][$func][$idx]=$sort;  

  106.   }  

  107.   /* 

  108.    * 从插件引擎里删除 执行的函数 

  109.    */  

  110.   function removeAction($tag,$func){  

  111.     global $action_arr,$action_meta;  

  112.     if(isset($action_meta[$tag][$func])){  

  113.         foreach($action_meta[$tag][$func] as $idx=>$sort){  

  114.             unset($action_arr[$tag][$sort][$idx]);  

  115.         }  

  116.         unset($action_meta[$tag][$func]);  

  117.     }  

  118.   }  

  119.   /* 

  120.    * 添加预删除函数,该函数会在下次执行插件引擎时,在函数集调用前被删除 

  121.    */  

  122.   function addRemoveAction($tag,$func){  

  123.     global $action_remove;  

  124.     if(in_array($func,(array)$action_remove[$tag])) return ;  

  125.     $action_remove[$tag][]=$func;  

  126.   }  

  127.   /* 摘取天上星 - 期待更深层次的扩展压缩...*/  

  128. ?>  



//执行例子如下

//为插件引擎准备好要用到的测试函数
function str2str2($str){
  return '

P标签开始 '.$str.' P标签结束

';
}
function str3str3($str){
  return 'b标签开始 '.$str.' b标签结束';

}

//注意:在测试三个例子时,一定要一个一个的测试,测试时请注释掉其他多余的例子,否则将无法看到插件引擎权限优先级的 实际对比效果产生异常结果!

例子一:
//str2str2函数的执行优先级小于str3str3,这里先执行str3str3($str)函数后执行str2str2($str)函数;
//实际运行流程解刨如下:
$str=str3str3('这是要像插件里所有函数传入的参数这里函数str3str3的执行优先级高于str2str2');
$str=str2str2($str);
echo $str; 
/*输出结果浏览器里查看HTML源代码得到如下内容:
 

P标签开始 b标签开始 这是要像插件里所有函数传入的参数这里函数str3str3的执行优先级高于str2str2 b标签结束 P标签结束


 */
addPlugin('cleanText','str2str2',array('str'=>''),1);
addPlugin('cleanText','str3str3',array('str'=>''),10);
echo doPlugin('cleanText',array('str'=>'这是要像插件里所有函数传入的参数这里函数str3str3的执行优先级高于str2str2'));
//例子二:
addPlugin('cleanText','str2str2',array('str'=>''),10);
addPlugin('cleanText','str3str3',array('str'=>''),1);
echo doPlugin('cleanText',array('str'=>'这是要像插件里所有函数传入的参数这里函数str2str2的执行优先级高于str3str3'));
/*运行结果HTML页面源代码如下:
b标签开始

P标签开始 这是要像插件里所有函数传入的参数这里函数str2str2的执行优先级高于str3str3 P标签结束

b标签结束
*/
//例子三:
addPlugin('cleanText','str2str2',array('str'=>''),1);
addPlugin('cleanText','str3str3',array('str'=>''),1);
echo doPlugin('cleanText',array('str'=>'当权限排序值大小一致时,后面的函数权限优先级要小于前面的故先添加的函数先执行,这里函数str3str3的执行优先级小于str2str2'));
/* 执行后的HTML源代码结果如下:
b标签开始

P标签开始 当权限排序值大小一致时,后面的函数权限优先级要小于前面的故先添加的函数先执行,这里函数str3str3的执行优先级小于str2str2 P标签结束

b标签结束

*/

//测试doAction执行插件的例子(该插件没有返回值,只执行!)
/*注,该插件为伍返回值插件,故而只用做输出 或直接执行场合,优先级同doPlugin插件优先级设置,故不详述!
function alertstr($str){
  echo "";
}
function alertstr2($str){
  echo $str.'1+2';
}
addAction('alert','alertstr',array('str'=>''),1);
addAction('alert','alertstr2',array('str'=>''),10);
doAction('alert',array('str'=>'要弹出的参数'));
//运行后的HTML源代码结果如下:

//要弹出的参数1+2

?>


分享名称:PHP下用B/S编程模式去实现C/S软件编程模式下的插件引擎功能!
标题网址:http://myzitong.com/article/gojpdj.html