最近準備做一個開源的個人部落格系統,因為在構想中要添加外掛程式功能,所以就研究了一下外掛程式功能的實現方法。
外掛程式的功能按照本人自己的理解就是對已有的程式進行功能方面的添加以及改進,外掛程式要與程式所提供的介面進行串連,然後通過已經串連的介面對程式的資料等等進行修改。
而外掛程式鉤子的作用就類似於一個外掛程式介面,外掛程式與程式內相應的鉤子進行串連,對程式提供的內容進行修改。
我的外掛程式機制全部是採用物件導向的方式進行架構的,在開始要對外掛程式進行初始化,就是使用一個數組將外掛程式的名稱存放起來,以供後續的鉤子進行調用。
$plug_config[]=array( 'plug_name'=>'onePlug', 'plug_version'=>'1.01');
這個外掛程式的功能我就是想對一段html內容添加一個好看的樣式,外掛程式我是放在./root/ext檔案夾內,以外掛程式名作為外掛程式檔案夾的名稱,main.php作為外掛程式的主調用入口。
外掛程式的內部是一個以外掛程式名為類名的Class。
',$plug_tem_global); $plug_tem_global=''.implode("
",$temarr).''; }}
這個 global $plug_tem_global; 是使用一個全域變數$plug_tem_global作為傳入內容的參數,對它進行修改就相當於對內容進行修改。
在外掛程式機制的主檔案中,外掛程式鉤子作為一個調用外掛程式的介面,它其實是一個字串變數,其內部的值就是存放插入當前位置外掛程式的數組的名稱
比如說上面外掛程式初始化的數組名稱為plug_config,那麼此處的外掛程式鉤子就是$plug_config,由於要在類的內部對這個變數進行操作,所以使用global將他變成了一個全域變數。
$plug_point_name='plug_config';global $$plug_point_name;
對於外掛程式的執行,在內部使用了一個迴圈來執行適用於當前鉤子的所有外掛程式
$plug_tem_arr=$$plug_point_name;$plug_num=count($plug_tem_arr);for($plug_i=0;$plug_i<$plug_num;$plug_i++){ if(isset($plug_tem_arr[$plug_i]['plug_name'])){ $plug_name=$plug_tem_arr[$plug_i]['plug_name']; $plug_file_address=Root.'ext'.DIRECTORY_SEPARATOR .$plug_name.DIRECTORY_SEPARATOR .'main.php'; if(file_exists($plug_file_address)){ require($plug_file_address); $plug_tem_obj=new $plug_name(); } }}
下面就是我不使用外掛程式與使用外掛程式後的效果對比,哈哈~ 從前有座山……