PHP下用B/S編程模式去實現C/S軟件編程模式下的插件引擎功能!

[php] view plaincopy在CODE上查看代碼片派生到我的代碼片

  1. <?php      

  2. /** 

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

  4.  * By: 摘取天上星! 

  5.  * Emali: [email protected] 

  6.  * Date: 2012升級版 

  7.  **/  

  8.   $plugin_arr=array();  

  9.   $plugin_meta=array();  

  10.   $plugin_remove=array();  

  11.   $action_arr=array();  

  12.   $action_meta=array();  

  13.   $action_remove=array();  

  14.   $idx=0;  

  15.   /* 

  16.    * 執行插件引擎中捆綁的所有函數事件(函數執行順序參加addPlugin函數添加插件時的第四個參數數字,數字越大優先級越高) 

  17.    * $tag 要執行的函數集插件標籤名 

  18.    * $args 要往函數中傳入的參數,依次按順序填寫,鍵名同addPlugin添加插件時第三個參數傳入的鍵名、數量對應一致,鍵名對應的值即傳入的參數值, 

  19.    * 該插件引擎是有返回值的插件引擎 

  20.    */  

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

  22.     global $plugin_arr,$plugin_remove;  

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

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

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

  26.         foreach($plugin_remove[$tagas $func){  

  27.             removePlugin($tag,$func);  

  28.         }  

  29.     }  

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

  31.     foreach($plugin_arr[$tagas $plugins){  

  32.         foreach($plugins as $plugins){  

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

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

  35.         }  

  36.     }  

  37.     return $args[$first];  

  38.   }  

  39.   /* 第一個參數爲自定義標籤集名, 

  40.    * 第二個參數是你要向標籤集裏添加的函數名, 

  41.    * 第三個數組參數爲第二個參數strAndStr1函數對應的參數集,有多少個函數參數,就需要添加多少個數組元素, 

  42.            參數按照先後順序依次填寫,鍵值爲空即可,且插件裏所有函數的參數個數必須一致,一個以上的參數,可多個, 

  43.            這裏的傳參數組只需要預寫好鍵名即可,在調用doPlugin插件時給對應的鍵值傳入鍵名對應的實際參數值即可 

  44.    * 第四個參數爲排序參數,從1到10的純數字,數值越大執行優先級越高,反之越小,默認爲值爲最大優先級10 

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

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

  47.    */  

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

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

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

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

  52.   }  

  53.   /* 

  54.    * 立即刪除函數集標籤中 的某個函數 

  55.    * 第一個參數爲自定義函數集標籤名稱 

  56.    * 第二個參數爲要從函數集裏 刪除的單個函數名稱 

  57.    */  

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

  59.     global $plugin_arr,$plugin_meta;  

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

  61.         foreach($plugin_meta[$tag][$funcas $idx=>$sort){  

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

  63.         }  

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

  65.     }  

  66.   }  

  67.   /* 

  68.    * 在下次執行doPlugin時刪除函數集標籤中 的某個函數(在doPlugin中的插件函數執行前刪除,並且刪除後執行插件引擎!) 

  69.    * 第一個參數爲自定義函數集標籤名稱 

  70.    * 第二個參數爲要從函數集裏 刪除的單個函數名稱 

  71.    */  

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

  73.     global $plugin_remove;  

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

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

  76.   }  

  77.   /* 

  78.    * 如下執行插件方法同上述有返回值的執行插件使用方法對應一致, 

  79.    * 唯一的區別是沒有返回值 

  80.    */  

  81.   /* 

  82.    * 執行插件引擎 

  83.    */  

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

  85.     global  $action_arr,$action_remove;  

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

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

  88.         foreach($action_remove[$tagas $func){  

  89.             removeAction($tag,$func);  

  90.         }  

  91.     }  

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

  93.     foreach($action_arr[$tagas $action_sort){  

  94.         foreach($action_sort as $action_idx){  

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

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

  97.         }  

  98.     }  

  99.   }  

  100.   /* 

  101.    * 向插件引擎裏添加函數 

  102.    */  

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

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

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

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

  107.   }  

  108.   /* 

  109.    * 從插件引擎裏刪除 執行的函數 

  110.    */  

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

  112.     global $action_arr,$action_meta;  

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

  114.         foreach($action_meta[$tag][$funcas $idx=>$sort){  

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

  116.         }  

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

  118.     }  

  119.   }  

  120.   /* 

  121.    * 添加預刪除函數,該函數會在下次執行插件引擎時,在函數集調用前被刪除 

  122.    */  

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

  124.     global $action_remove;  

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

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

  127.   }  

  128.   /* 摘取天上星 - 期待更深層次的擴展壓縮...*/  

  129. ?>  




<?php

//執行例子如下

//爲插件引擎準備好要用到的測試函數
function str2str2($str){
  return '<p>P標籤開始 '.$str.' P標籤結束<p/>';
}
function str3str3($str){
  return '<b style="color:red">b標籤開始 '.$str.' b標籤結束<b/>';

}

//注意:在測試三個例子時,一定要一個一個的測試,測試時請註釋掉其他多餘的例子,否則將無法看到插件引擎權限優先級的 實際對比效果產生異常結果!

例子一:
//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'));
//例子二:
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/>
*/
//例子三:
addPlugin('cleanText','str2str2',array('str'=>''),1);
addPlugin('cleanText','str3str3',array('str'=>''),1);
echo doPlugin('cleanText',array('str'=>'當權限排序值大小一致時,後面的函數權限優先級要小於前面的故先添加的函數先執行,這裏函數str3str3的執行優先級小於str2str2'));
/* 執行後的HTML源代碼結果如下:
<b style="color:red">b標籤開始 <p>P標籤開始 當權限排序值大小一致時,後面的函數權限優先級要小於前面的故先添加的函數先執行,這裏函數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>

?>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章