天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

在PHP中使用反射技術的架構插件使用說明

反射API的插件方法是基于在運行時決定程序的功能來實現的,也就是說,它允許創建可選的接口方法,并在首次使用時檢測到這部分接口方法,只有在插件中存在這部分接口的情況下,它們才會被用到.
假設擁有這樣的接口
復制代碼 代碼如下:
interface IPlugin{
function getMenuItems();
function getArticles();
function getSideBars();
}
class Someplugin implelents IPlugin{
public function getMenuItems(){
//沒有菜單項
return null;
}
public function getArticles(){ //沒有任何文章
return null;
}
public function getSidBars(){
//有側邊
return array("sidbarItem');
}
}
[html]
這種情況并不太合理,因為滿足了接口的要求,為大量方法添加了不會用到的函數體,如果在API中有數百個方法,這樣是行不通的。
反射API提供了一種解決方法,使用get_declared_classes()函數取得當前加載的類,并檢測哪個類實現了IPlugin"標記"的方法。
在這里寫了一個使用反射查找插件的方法
[code]
function findPlugins(){
$plugins=array();
foreach (get_declared_classes() as $class){
$reflectionsClass=new ReflectionClass($class);
if($reflectionsClass->implementsInterface('IPlugin')){
$plugins[]=$reflectionsClass;
}
}
return $plugins;
}

為了為了確定類是否實現了單個方法,可以使用REfectionClass類的hasMethod()方法。
確定用于菜單的類的成員
復制代碼 代碼如下:
function computerMenu(){
$menu=array();
foreach (findPlugins() as $plugin){
if($plugin->hasMethod('getMenuItems')){
$reflectionMethod=$plugin->getMethod('getMenuItems');
if($reflectionMethod->isStatic()){
$items=$reflectionMethod->invoke(null);
}else{
$pluginInstance=$plugin->newInstance();
$items=$reflectionMethod->invoke($pluginInstance);
}
$menu=array_merge($menu,$items);
}
}
return $menu;
}

得到類的實例后,需要檢測是否能夠靜態檢測調用API方法,如果方法是靜態的,只需要調用 invoke()函數,
如下 public mixed invoke(stdclass object,mixed args=null)
另一方面,如果方法不是靜態的,需要取得插件的一個實例來調用這個方法,要從Refectionclass對象取得類的一個實例,
調用 它的newInstance()方法,然后再使用invoke()方法,返回實例傳入就可以。
確定用于文章和側邊的類的成員
復制代碼 代碼如下:
function computeArticles(){
$articles=array();
foreach (findPlugins() as $plugin){
if($plugin->hasMethod('getArticles')){
$reflectionMethod=$plugin->getMethod('getArticles');
if($reflectionMethod->isStatic()){
$items=$reflectionMethod->invoke(null);
}else{
$pluginInstance=$plugin->newInstance();
$items=$reflectionMethod->invoke($pluginInstance);
}
$articles=array_merge($articles,$items);
}
}
return $articles;
}
function computeSidebars(){
$sidebars=array();
foreach (findPlugins() as $plugin){
if($plugin->hasMethod('getSidebars')){
$reflectionMethod=$plugin->getMethod('getSidebars');
if($reflectionMethod->isStatic()){
$items=$reflectionMethod->invoke(null);
}else{
$pluginInstance=$plugin->newInstance();
$items=$reflectionMethod->invoke($pluginInstance);
}
$sidebars=array_merge($sidebars,$items);
}
}
return $sidebars;
}

創建一個實現了可選特性的反射式插件
復制代碼 代碼如下:
class MyCoolPlugin implements IPlugin{
public static function getName(){return 'MyCoolPlugin';}
public static function getMenuItems(){
//菜單項的數字索引數組
return array(array('description'=>'MyCoolPlugin','link'=>'/MyCoolPlugin'));
}
public static function getArticles(){
//文章的數字索引數組
return array(array('path'=>'/MyCoolPlugin','title'=>'This is a really cool article',
'text'=>'This article is cool because...'));
}
public static function getSideBars(){
//文章的側邊欄索引數組
return array(array('sideBars'=>'/MyCoolPlugin'));
}
}

最后只要這樣就可以使用這樣插件了:
復制代碼 代碼如下:
$menu=computeArticles();
$sidebars=computeSidebars();
$articles=computeArticles();
print_r($menu);
print_r($sidebars);
print_r($articles);

php技術在PHP中使用反射技術的架構插件使用說明,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲 欧美 视频 手机在线 | 879影视动漫h免费观看 | 久久国产精品二区99 | 99精品视频在线观看免费播放 | 欧式午夜理伦三级在线观看 | 午夜天堂AV久久久噜噜噜 | a毛片基地免费全部视频 | 美女挑战50厘米长的黑人 | 日本理论片和搜子同居的日子2 | 免费无码国产欧美久久18 | 国产成人女人在线视频观看 | 亚洲AV中文字幕无码久久 | 国内精品久久人妻无码HD浪潮 | 美国特级成人毛片 | 一个人免费播放高清在线观看 | 精品国产精品人妻久久无码五月天 | 日本无码免费久久久精品 | 亚洲中文字幕乱码熟女在线 | 日韩亚洲不卡在线视频 | 久久AV国产麻豆HD真实乱 | 国产永不无码精品AV永久 | 精品国产免费观看久久久 | 久久精品国产亚洲AV天美18 | www.狠狠色| 国产亚洲精品久久久久久久 | 福利一区福利二区 | 91精品免费久久久久久久久 | 99欧美精品 | 亚洲白色白色在线播放 | 中文无码第3页不卡av | 麻豆一二三区果冻 | 国产精品线路一线路二 | 亚洲国产精品久久精品成人网站 | 伊人久久综在合线亚洲 | 最近的中文字幕2019国语 | 大中国免费视频大全在线观看 | 毛片免费观看的视频在线 | 被六个男人躁到一夜同性 | 亚洲国产高清在线 | 久色视频网 | 雪恋电影完整版免费观看 |