您好,登錄后才能下訂單哦!
[php] view plaincopy
<?php
/**
* 摘取天上星 版 插件引擎 第二版 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;
/*
* 執(zhí)行插件引擎中捆綁的所有函數(shù)事件(函數(shù)執(zhí)行順序參加addPlugin函數(shù)添加插件時的第四個參數(shù)數(shù)字,數(shù)字越大優(yōu)先級越高)
* $tag 要執(zhí)行的函數(shù)集插件標簽名
* $args 要往函數(shù)中傳入的參數(shù),依次按順序填寫,鍵名同addPlugin添加插件時第三個參數(shù)傳入的鍵名、數(shù)量對應一致,鍵名對應的值即傳入的參數(shù)值,
* 該插件引擎是有返回值的插件引擎
*/
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];
}
/* 第一個參數(shù)為自定義標簽集名,
* 第二個參數(shù)是你要向標簽集里添加的函數(shù)名,
* 第三個數(shù)組參數(shù)為第二個參數(shù)strAndStr1函數(shù)對應的參數(shù)集,有多少個函數(shù)參數(shù),就需要添加多少個數(shù)組元素,
參數(shù)按照先后順序依次填寫,鍵值為空即可,且插件里所有函數(shù)的參數(shù)個數(shù)必須一致,一個以上的參數(shù),可多個,
這里的傳參數(shù)組只需要預寫好鍵名即可,在調用doPlugin插件時給對應的鍵值傳入鍵名對應的實際參數(shù)值即可
* 第四個參數(shù)為排序參數(shù),從1到10的純數(shù)字,數(shù)值越大執(zhí)行優(yōu)先級越高,反之越小,默認為值為最大優(yōu)先級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;
}
/*
* 立即刪除函數(shù)集標簽中 的某個函數(shù)
* 第一個參數(shù)為自定義函數(shù)集標簽名稱
* 第二個參數(shù)為要從函數(shù)集里 刪除的單個函數(shù)名稱
*/
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]);
}
}
/*
* 在下次執(zhí)行doPlugin時刪除函數(shù)集標簽中 的某個函數(shù)(在doPlugin中的插件函數(shù)執(zhí)行前刪除,并且刪除后執(zhí)行插件引擎!)
* 第一個參數(shù)為自定義函數(shù)集標簽名稱
* 第二個參數(shù)為要從函數(shù)集里 刪除的單個函數(shù)名稱
*/
function addRemovePlugin($tag,$func){
global $plugin_remove;
if(in_array($func,(array)$plugin_remove[$tag])) return ;
$plugin_remove[$tag][]=$func;
}
/*
* 如下執(zhí)行插件方法同上述有返回值的執(zhí)行插件使用方法對應一致,
* 唯一的區(qū)別是沒有返回值
*/
/*
* 執(zhí)行插件引擎
*/
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']));
}
}
}
/*
* 向插件引擎里添加函數(shù)
*/
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;
}
/*
* 從插件引擎里刪除 執(zhí)行的函數(shù)
*/
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]);
}
}
/*
* 添加預刪除函數(shù),該函數(shù)會在下次執(zhí)行插件引擎時,在函數(shù)集調用前被刪除
*/
function addRemoveAction($tag,$func){
global $action_remove;
if(in_array($func,(array)$action_remove[$tag])) return ;
$action_remove[$tag][]=$func;
}
/* 摘取天上星 - 期待更深層次的擴展壓縮...*/
?>
<?php
//執(zhí)行例子如下
//為插件引擎準備好要用到的測試函數(shù)
function str2str2($str){
return '<p>P標簽開始 '.$str.' P標簽結束<p/>';
}
function str3str3($str){
return '<b >b標簽開始 '.$str.' b標簽結束<b/>';
}
//注意:在測試三個例子時,一定要一個一個的測試,測試時請注釋掉其他多余的例子,否則將無法看到插件引擎權限優(yōu)先級的 實際對比效果產生異常結果!
例子一:
//str2str2函數(shù)的執(zhí)行優(yōu)先級小于str3str3,這里先執(zhí)行str3str3($str)函數(shù)后執(zhí)行str2str2($str)函數(shù);
//實際運行流程解刨如下:
$str=str3str3('這是要像插件里所有函數(shù)傳入的參數(shù)這里函數(shù)str3str3的執(zhí)行優(yōu)先級高于str2str2');
$str=str2str2($str);
echo $str;
/*輸出結果瀏覽器里查看HTML源代碼得到如下內容:
<p>P標簽開始 <b >b標簽開始 這是要像插件里所有函數(shù)傳入的參數(shù)這里函數(shù)str3str3的執(zhí)行優(yōu)先級高于str2str2 b標簽結束<b/> P標簽結束<p/>
*/
addPlugin('cleanText','str2str2',array('str'=>''),1);
addPlugin('cleanText','str3str3',array('str'=>''),10);
echo doPlugin('cleanText',array('str'=>'這是要像插件里所有函數(shù)傳入的參數(shù)這里函數(shù)str3str3的執(zhí)行優(yōu)先級高于str2str2'));
//例子二:
addPlugin('cleanText','str2str2',array('str'=>''),10);
addPlugin('cleanText','str3str3',array('str'=>''),1);
echo doPlugin('cleanText',array('str'=>'這是要像插件里所有函數(shù)傳入的參數(shù)這里函數(shù)str2str2的執(zhí)行優(yōu)先級高于str3str3'));
/*運行結果HTML頁面源代碼如下:
<b >b標簽開始 <p>P標簽開始 這是要像插件里所有函數(shù)傳入的參數(shù)這里函數(shù)str2str2的執(zhí)行優(yōu)先級高于str3str3 P標簽結束<p/> b標簽結束<b/>
*/
//例子三:
addPlugin('cleanText','str2str2',array('str'=>''),1);
addPlugin('cleanText','str3str3',array('str'=>''),1);
echo doPlugin('cleanText',array('str'=>'當權限排序值大小一致時,后面的函數(shù)權限優(yōu)先級要小于前面的故先添加的函數(shù)先執(zhí)行,這里函數(shù)str3str3的執(zhí)行優(yōu)先級小于str2str2'));
/* 執(zhí)行后的HTML源代碼結果如下:
<b >b標簽開始 <p>P標簽開始 當權限排序值大小一致時,后面的函數(shù)權限優(yōu)先級要小于前面的故先添加的函數(shù)先執(zhí)行,這里函數(shù)str3str3的執(zhí)行優(yōu)先級小于str2str2 P標簽結束<p/> b標簽結束<b/>
*/
//測試doAction執(zhí)行插件的例子(該插件沒有返回值,只執(zhí)行!)
/*注,該插件為伍返回值插件,故而只用做輸出 或直接執(zhí)行場合,優(yōu)先級同doPlugin插件優(yōu)先級設置,故不詳述!
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'=>'要彈出的參數(shù)'));
//運行后的HTML源代碼結果如下:
//要彈出的參數(shù)1+2<script>alert('要彈出的參數(shù)');</script>
?>
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。