日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php反射机制详解,PHP反射机制实现插件的可插拔设计

發布時間:2023/12/19 php 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php反射机制详解,PHP反射机制实现插件的可插拔设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

功能描述:

頁面擁有一個主導航菜單,里頭有默認連接若干。

插件統一存放在一個目錄,插件載入后會自動在導航菜單中增加上自己所需的鏈接。

插件載入時可執行一定的操作。

動態增刪插件無需改動代碼。

最終效果:

首頁,插件1,插件2

“首頁”是系統自帶的菜單項?!安寮?”和“插件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實現接口:

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() . ” 載入中…
”;

}

}

?>

Plugin2實現接口:

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() . ” 載入中…
”;

}

}

?>

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 “{$m['text']} “;

}

注意第6部就是PHP的反射操作,是不是很簡單呢。分析下其中代碼,一個完整的反射操作時機只有2行代碼!

$refClass = new ReflectionClass($class);

$menuItem = $refClass->getMethod(‘getMenu’)->invoke(null);

好了,反射的基本功能就介紹到這了。當然了,PHP的反射功能不僅僅如此,有興趣的自己發掘去吧。

總結

以上是生活随笔為你收集整理的php反射机制详解,PHP反射机制实现插件的可插拔设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。