這篇文章主要介紹了PHP基於反射機制實現外掛程式的可插拔設計,結合執行個體形式較為詳細的分析了外掛程式的功能、反射機制原理與實現可插拔設計的操作步驟,需要的朋友可以參考下
本文執行個體講述了PHP基於反射機制實現外掛程式的可插拔設計。分享給大家供大家參考,具體如下:
說PHP和ASP等同的朋友們可以就此打住了,PHP支援反射,而且還是非常的強大。好了,我們開始今天的話題。
功能描述:
頁面擁有一個主導覽功能表,裡頭有預設串連若干。
外掛程式統一存放在一個目錄,外掛程式載入後會自動在導覽功能表中增加上自己所需的連結。
外掛程式載入時可執行一定的操作。
動態增刪外掛程式無需改動代碼。
最終效果:
首頁,外掛程式1,外掛程式2
"首頁"是系統內建的功能表項目。"外掛程式1"和"外掛程式2"是由外掛程式註冊的功能表項目。
實現過程:
1. 檔案結構
Learn
plugin
plugin1.php
plugin2.php
test.php
如此設計後,頁面入口為test.php,外掛程式都存放在plugin目錄下,只要遍曆plugin目錄就可以找到所有的外掛程式了。
2. 設計外掛程式介面
interface IPlugin{static function getname();static function init();static function getMenu();}
3. 外掛程式內部實現介面
Plugin1實現介面:
<?phpClass Welcome implements IPlugin{static function getname(){return 'Welcome (Plugin)';}static function getMenu(){return array('text'=>'外掛程式1′,'href'=>'http://www.google.com');}static function init(){echo self::getname() . " 載入中…<br />";}}?>
Plugin2實現介面:
<?phpClass ShowAD implements IPlugin{static function getname(){return 'Show AD (Plugin)';}static function getMenu(){return array('text'=>'外掛程式2′,'href'=>'http://www.live.com');}static function init(){echo self::getname() . " 載入中…<br />";}}?>
4. 首頁面初始化主導覽功能表
$menu[] = array('text'=>'首頁','href'=>'/test.php');
5. 遍曆外掛程式目錄,載入全部外掛程式
$pluginPath = $_SERVER['DOCUMENT_ROOT'] . '/plugin';$dirHd = opendir($pluginPath);while ($file = readdir($dirHd)){$pluginFilePath = $pluginPath . '/' . $file;if($file!='.' && $file!='..' && is_file($pluginFilePath)){include "$pluginFilePath";}}
6. 過濾出實現了IPlugin介面的外掛程式,並執行外掛程式注入操作。
// 反射執行方法(注入菜單)foreach (get_declared_classes() as $class){$refClass = new ReflectionClass($class);if($refClass->implementsInterface('IPlugin')){//外掛程式初始化$refClass->getMethod('init')->invoke(null);//擷取注入菜單$menuItem = $refClass->getMethod('getMenu')->invoke(null);//合并功能表項目$menu = array_merge($menu, array($menuItem));}}
7. 首頁面輸出菜單HTML
foreach ($menu as $m){echo "<a href='{$m['href']}'>{$m['text']}</a> ";}
注意第6部就是PHP的反射操作,是不是很簡單呢。分析下其中代碼,一個完整的反射操作時機只有2行代碼!
$refClass = new ReflectionClass($class);$menuItem = $refClass->getMethod('getMenu')->invoke(null);
好了,反射的準系統就介紹到這了。當然了,PHP的反射功能不僅僅如此,有興趣的自己發掘去吧。