国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP基于反射機制實現(xiàn)插件的可插拔設(shè)計詳解

2024-05-04 23:52:04
字體:
供稿:網(wǎng)友

本文實例講述了PHP基于反射機制實現(xiàn)插件的可插拔設(shè)計。分享給大家供大家參考,具體如下:

說PHP和ASP等同的朋友們可以就此打住了,PHP支持反射,而且還是非常的強大。好了,我們開始今天的話題。

功能描述:

頁面擁有一個主導(dǎo)航菜單,里頭有默認連接若干。
插件統(tǒng)一存放在一個目錄,插件載入后會自動在導(dǎo)航菜單中增加上自己所需的鏈接。
插件載入時可執(zhí)行一定的操作。
動態(tài)增刪插件無需改動代碼。

最終效果:

首頁,插件1,插件2

"首頁"是系統(tǒng)自帶的菜單項。"插件1"和"插件2"是由插件注冊的菜單項。

實現(xiàn)過程:

1. 文件結(jié)構(gòu)

Learn
plugin
plugin1.php
plugin2.php
test.php

如此設(shè)計后,頁面入口為test.php,插件都存放在plugin目錄下,只要遍歷plugin目錄就可以找到所有的插件了。

2. 設(shè)計插件接口

interface IPlugin{static function getname();static function init();static function getMenu();}

3. 插件內(nèi)部實現(xiàn)接口

Plugin1實現(xiàn)接口:

<?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實現(xiàn)接口:

<?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. 主頁面初始化主導(dǎo)航菜單

$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. 過濾出實現(xiàn)了IPlugin接口的插件,并執(zhí)行插件注入操作。

// 反射執(zhí)行方法(注入菜單)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的反射功能不僅僅如此,有興趣的自己發(fā)掘去吧。

希望本文所述對大家PHP程序設(shè)計有所幫助。


注:相關(guān)教程知識閱讀請移步到PHP教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 普定县| 淮北市| 武功县| 侯马市| 和田市| 瑞安市| 夏邑县| 凤山市| 株洲市| 鲁甸县| 新建县| 皋兰县| 岳普湖县| 浏阳市| 寿光市| 武汉市| 莲花县| 民和| 萨迦县| 昭平县| 沭阳县| 西盟| 唐河县| 寻甸| 三河市| 万盛区| 乌兰察布市| 谢通门县| 新密市| 独山县| 呼图壁县| 庄河市| 高邑县| 荃湾区| 清涧县| 慈利县| 崇文区| 邓州市| 博爱县| 金川县| 临江市|