《PHP學習:PHP基于反射機制實現插件的可插拔設計詳解》要點:
本文介紹了PHP學習:PHP基于反射機制實現插件的可插拔設計詳解,希望對您有用。如果有疑問,可以聯系我們。
PHP編程本文實例講述了PHP基于反射機制實現插件的可插拔設計.分享給大家供大家參考,具體如下:
PHP編程說PHP和ASP等同的朋友們可以就此打住了,PHP支持反射,而且還是非常的強大.好了,我們開始今天的話題.
PHP編程功能描述:
PHP編程頁面擁有一個主導航菜單,里頭有默認連接若干.
插件統一存放在一個目錄,插件載入后會自動在導航菜單中增加上自己所需的鏈接.
插件載入時可執行一定的操作.
動態增刪插件無需改動代碼.
PHP編程最終效果:
PHP編程首頁,插件1,插件2
PHP編程"首頁"是系統自帶的菜單項."插件1"和"插件2"是由插件注冊的菜單項.
PHP編程實現過程:
PHP編程1. 文件結構
PHP編程Learn
plugin
plugin1.php
plugin2.php
test.php
PHP編程如此設計后,頁面入口為test.php,插件都存放在plugin目錄下,只要遍歷plugin目錄就可以找到所有的插件了.
PHP編程2. 設計插件接口
PHP編程
interface IPlugin{
static function getname();
static function init();
static function getMenu();
}
PHP編程3. 插件內部實現接口
PHP編程Plugin1實現接口:
PHP編程
<?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 />";
}
}
?>
PHP編程Plugin2實現接口:
PHP編程
<?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 />";
}
}
?>
PHP編程4. 主頁面初始化主導航菜單
PHP編程
$menu[] = array(
'text'=>'首頁',
'href'=>'/test.php'
);
PHP編程5. 遍歷插件目錄,載入全部插件
PHP編程
$pluginPath = $_SERVER['DOCUMENT_ROOT'] . '/plugin';
$dirHd = opendir($pluginPath);
while ($file = readdir($dirHd)){
$pluginFilePath = $pluginPath . '/' . $file;
if($file!='.' && $file!='..' && is_file($pluginFilePath)){
include "$pluginFilePath";
}
}
PHP編程6. 過濾出實現了IPlugin接口的插件,并執行插件注入操作.
PHP編程
// 反射執行方法(注入菜單)
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));
}
}
PHP編程7. 主頁面輸出菜單HTML
PHP編程
foreach ($menu as $m){
echo "<a href='{$m['href']}'>{$m['text']}</a> ";
}
PHP編程注意第6部就是PHP的反射操作,是不是很簡單呢.分析下其中代碼,一個完整的反射操作時機只有2行代碼!
PHP編程
$refClass = new ReflectionClass($class);
$menuItem = $refClass->getMethod('getMenu')->invoke(null);
PHP編程好了,反射的基本功能就介紹到這了.當然了,PHP的反射功能不僅僅如此,有興趣的自己發掘去吧.
PHP編程更多關于PHP相關內容感興趣的讀者可查看本站專題:《PHP數組(Array)操作技巧大全》、《php排序算法總結》、《PHP常用遍歷算法與技巧總結》、《PHP數據結構與算法教程》、《php程序設計算法總結》、《PHP數學運算技巧總結》、《php正則表達式用法總結》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》及《php常見數據庫操作技巧匯總》
PHP編程希望本文所述對大家PHP程序設計有所幫助.
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/2836.html