亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP基于反射機制如何實現插件的可插拔設計

發布時間:2021-08-26 15:38:23 來源:億速云 閱讀:123 作者:小新 欄目:開發技術

這篇文章主要介紹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基于反射機制如何實現插件的可插拔設計”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

陆良县| 莒南县| 石台县| 鞍山市| 桃园市| 霍州市| 佛冈县| 中阳县| 襄垣县| 缙云县| 晴隆县| 西华县| 承德县| 丰宁| 松潘县| 霍林郭勒市| 丰县| 积石山| 洱源县| 武隆县| 齐河县| 五华县| 扬中市| 麦盖提县| 建德市| 平原县| 宜兰县| 海阳市| 开化县| 红河县| 都兰县| 泾源县| 牟定县| 准格尔旗| 九龙县| 启东市| 遂宁市| 福清市| 陇南市| 明溪县| 阿瓦提县|