'','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; } /* * 立即删除函数集标签中 的某个函数 * 第一个参数为自定义函数集标签名称 * 第二个参数为要从函数集里 删除的单个函数名称 */ 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中的插件函数执行前删除,并且删除后执行插件引擎!) * 第一个参数为自定义函数集标签名称 * 第二个参数为要从函数集里 删除的单个函数名称 */ function addremoveplugin($tag,$func){ global $plugin_remove; if(in_array($func,(array)$plugin_remove[$tag])) return ; $plugin_remove[$tag][]=$func; } /* * 如下执行插件方法同上述有返回值的执行插件使用方法对应一致, * 唯一的区别是没有返回值 */ /* * 执行插件引擎 */ 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; } /* 摘取天上星 - 期待更深层次的扩展压缩...*/?>
''),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
?>