PHP下用B/S编程模式去实现C/S软件编程模式下的插件引擎功能!
来源:程序员人生 发布时间:2015-03-26 09:35:21 阅读次数:2318次
<?php
/**
* 摘取天上星 版 插件引擎 第2版 version 2.0
* By: 摘取天上星!
* Emali: happy.yin@qq.com
* Date: 2012升级版
**/
$plugin_arr=array();
$plugin_meta=array();
$plugin_remove=array();
$action_arr=array();
$action_meta=array();
$action_remove=array();
$idx=0;
/*
* 履行插件引擎中捆绑的所有函数事件(函数履行顺序参加addPlugin函数添加插件时的第4个参数数字,数字越大优先级越高)
* $tag 要履行的函数集插件标签名
* $args 要往函数中传入的参数,顺次按顺序填写,键名同addPlugin添加插件时第3个参数传入的键名、数量对应1致,键名对应的值即传入的参数值,
* 该插件引擎是有返回值的插件引擎
*/
function doPlugin($tag,$args=array()){
global $plugin_arr,$plugin_remove;
$first=array_search(current($args),$args);
if(empty($plugin_arr[$tag])) return $args[$first];
if(isset($plugin_remove[$tag])){
foreach($plugin_remove[$tag] as $func){
removePlugin($tag,$func);
}
}
krsort($plugin_arr[$tag]);
foreach($plugin_arr[$tag] as $plugins){
foreach($plugins as $plugins){
$plugins['args']=array_merge($plugins['args'],$args);
$args[$first]=call_user_func_array($plugins['func'],array_slice($plugins['args'],0,$plugins['args_count']));
}
}
return $args[$first];
}
/* 第1个参数为自定义标签集名,
* 第2个参数是你要向标签集里添加的函数名,
* 第3个数组参数为第2个参数strAndStr1函数对应的参数集,有多少个函数参数,就需要添加多少个数组元素,
参数依照前后顺序顺次填写,键值为空便可,且插件里所有函数的参数个数必须1致,1个以上的参数,可多个,
这里的传参数组只需要预写好键名便可,在调用doPlugin插件时给对应的键值传入键名对应的实际参数值便可
* 第4个参数为排序参数,从1到10的纯数字,数值越大履行优先级越高,反之越小,默许为值为最大优先级10
* addPlugin('cleanText','strAndStr1',array('str'=>'','str2'=>''),1);
* addPlugin('cleanText','strAndStr2',array('str'=>'','str2'=>''),2);
*/
function addPlugin($tag,$func,$args=array(),$sort=10){
global $plugin_arr,$plugin_meta,$idx;
$plugin_arr[$tag][$sort][++$idx]=array('func'=>$func,'args'=>$args,'args_count'=>sizeof($args));
$plugin_meta[$tag][$func][$idx]=$sort;
}
/*
* 立即删除函数集标签中 的某个函数
* 第1个参数为自定义函数集标签名称
* 第2个参数为要从函数集里 删除的单个函数名称
*/
function removePlugin($tag,$func){
global $plugin_arr,$plugin_meta;
if(isset($plugin_meta[$tag][$func])){
foreach($plugin_meta[$tag][$func] as $idx=>$sort){
unset($plugin_arr[$tag][$sort][$idx]);
}
unset($plugin_meta[$tag][$func]);
}
}
/*
* 在下次履行doPlugin时删除函数集标签中 的某个函数(在doPlugin中的插件函数履行前删除,并且删除后履行插件引擎!)
* 第1个参数为自定义函数集标签名称
* 第2个参数为要从函数集里 删除的单个函数名称
*/
function addRemovePlugin($tag,$func){
global $plugin_remove;
if(in_array($func,(array)$plugin_remove[$tag])) return ;
$plugin_remove[$tag][]=$func;
}
/*
* 以下履行插件方法同上述有返回值的履行插件使用方法对应1致,
* 唯1的区分是没有返回值
*/
/*
* 履行插件引擎
*/
function doAction($tag,$args=array()){
global $action_arr,$action_remove;
if(empty($action_arr[$tag])) return ;
if(isset($action_remove[$tag])){
foreach($action_remove[$tag] as $func){
removeAction($tag,$func);
}
}
krsort($action_arr[$tag]);
foreach($action_arr[$tag] as $action_sort){
foreach($action_sort as $action_idx){
$action_idx['args']=array_merge($action_idx['args'],$args);
call_user_func_array($action_idx['func'],array_slice($action_idx['args'],0,$action_idx['args_count']));
}
}
}
/*
* 向插件引擎里添加函数
*/
function addAction($tag,$func,$args=array(),$sort=10){
global $action_arr,$action_meta,$idx;
$action_arr[$tag][$sort][++$idx]=array('func'=>$func,'args'=>$args,'args_count'=>sizeof($args));
$action_meta[$tag][$func][$idx]=$sort;
}
/*
* 从插件引擎里删除 履行的函数
*/
function removeAction($tag,$func){
global $action_arr,$action_meta;
if(isset($action_meta[$tag][$func])){
foreach($action_meta[$tag][$func] as $idx=>$sort){
unset($action_arr[$tag][$sort][$idx]);
}
unset($action_meta[$tag][$func]);
}
}
/*
* 添加预删除函数,该函数会在下次履行插件引擎时,在函数集调用前被删除
*/
function addRemoveAction($tag,$func){
global $action_remove;
if(in_array($func,(array)$action_remove[$tag])) return ;
$action_remove[$tag][]=$func;
}
/* 摘取天上星 - 期待更深层次的扩大紧缩...*/
?>
<?php
//履行例子以下
//为插件引擎准备好要用到的测试函数
function str2str2($str){
return '<p>P标签开始 '.$str.' P标签结束<p/>';
}
function str3str3($str){
return '<b style="color:red">b标签开始 '.$str.' b标签结束<b/>';
}
//注意:在测试3个例子时,1定要1个1个的测试,测试时请注释掉其他过剩的例子,否则将没法看到插件引擎权限优先级的 实际对照效果产生异常结果!
例子1:
//str2str2函数的履行优先级小于str3str3,这里先履行str3str3($str)函数后履行str2str2($str)函数;
//实际运行流程解刨以下:
$str=str3str3('这是要像插件里所有函数传入的参数这里函数str3str3的履行优先级高于str2str2');
$str=str2str2($str);
echo $str;
/*输出结果阅读器里查看HTML源代码得到以下内容:
<p>P标签开始 <b style="color:red">b标签开始 这是要像插件里所有函数传入的参数这里函数str3str3的履行优先级高于str2str2 b标签结束<b/> P标签结束<p/>
*/
addPlugin('cleanText','str2str2',array('str'=>''),1);
addPlugin('cleanText','str3str3',array('str'=>''),10);
echo doPlugin('cleanText',array('str'=>'这是要像插件里所有函数传入的参数这里函数str3str3的履行优先级高于str2str2'));
//例子2:
addPlugin('cleanText','str2str2',array('str'=>''),10);
addPlugin('cleanText','str3str3',array('str'=>''),1);
echo doPlugin('cleanText',array('str'=>'这是要像插件里所有函数传入的参数这里函数str2str2的履行优先级高于str3str3'));
/*运行结果HTML页面源代码以下:
<b style="color:red">b标签开始 <p>P标签开始 这是要像插件里所有函数传入的参数这里函数str2str2的履行优先级高于str3str3 P标签结束<p/> b标签结束<b/>
*/
//例子3:
addPlugin('cleanText','str2str2',array('str'=>''),1);
addPlugin('cleanText','str3str3',array('str'=>''),1);
echo doPlugin('cleanText',array('str'=>'当权限排序值大小1致时,后面的函数权限优先级要小于前面的故先添加的函数先履行,这里函数str3str3的履行优先级小于str2str2'));
/* 履行后的HTML源代码结果以下:
<b style="color:red">b标签开始 <p>P标签开始 当权限排序值大小1致时,后面的函数权限优先级要小于前面的故先添加的函数先履行,这里函数str3str3的履行优先级小于str2str2 P标签结束<p/> b标签结束<b/>
*/
//测试doAction履行插件的例子(该插件没有返回值,只履行!)
/*注,该插件为伍返回值插件,故而只用做输出 或直接履行场合,优先级同doPlugin插件优先级设置,故不详述!
function alertstr($str){
echo "<script>alert('$str');</script>";
}
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<script>alert('要弹出的参数');</script>
?>
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠