'','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; } /* 摘取天上星 - 期待更深層次的擴充壓縮...*/?>
//執行例子如下
//為外掛程式引擎準備好要用到的測試函數
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
?>