這篇文章主要介紹了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實作介面:
<?php Class 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實作介面:
<?php Class 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的反射功能不只如此,有興趣的自己也發掘去吧。
以上是php反射機制實作插件的設計實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!