一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - 在PHP中使用反射技術(shù)的架構(gòu)插件使用說明

在PHP中使用反射技術(shù)的架構(gòu)插件使用說明

2019-10-30 16:25php教程網(wǎng) PHP教程

基于反射的插件架構(gòu)實(shí)際上并沒有歸類為一種模式,因?yàn)樗鼘?shí)際上不是一個(gè)模板,而是一糸列組合在一起的形成程序架構(gòu)的概念。

反射API的插件方法是基于在運(yùn)行時(shí)決定程序的功能來實(shí)現(xiàn)的,也就是說,它允許創(chuàng)建可選的接口方法,并在首次使用時(shí)檢測到這部分接口方法,只有在插件中存在這部分接口的情況下,它們才會(huì)被用到. 
假設(shè)擁有這樣的接口 

復(fù)制代碼代碼如下:


interface IPlugin{ 
function getMenuItems(); 
function getArticles(); 
function getSideBars(); 

class Someplugin implelents IPlugin{ 
public function getMenuItems(){ 
//沒有菜單項(xiàng) 
return null; 

public function getArticles(){ //沒有任何文章 
return null; 

public function getSidBars(){ 
//有側(cè)邊 
return array("sidbarItem'); 


[html] 
這種情況并不太合理,因?yàn)闈M足了接口的要求,為大量方法添加了不會(huì)用到的函數(shù)體,如果在API中有數(shù)百個(gè)方法,這樣是行不通的。 
反射API提供了一種解決方法,使用get_declared_classes()函數(shù)取得當(dāng)前加載的類,并檢測哪個(gè)類實(shí)現(xiàn)了IPlugin"標(biāo)記"的方法。 
在這里寫了一個(gè)使用反射查找插件的方法 
[code] 
function findPlugins(){ 
$plugins=array(); 
foreach (get_declared_classes() as $class){ 
$reflectionsClass=new ReflectionClass($class); 
if($reflectionsClass->implementsInterface('IPlugin')){ 
$plugins[]=$reflectionsClass; 


return $plugins; 


為了為了確定類是否實(shí)現(xiàn)了單個(gè)方法,可以使用REfectionClass類的hasMethod()方法。 
確定用于菜單的類的成員 

復(fù)制代碼代碼如下:


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; 


得到類的實(shí)例后,需要檢測是否能夠靜態(tài)檢測調(diào)用API方法,如果方法是靜態(tài)的,只需要調(diào)用 invoke()函數(shù), 
如下 public mixed invoke(stdclass object,mixed args=null) 
另一方面,如果方法不是靜態(tài)的,需要取得插件的一個(gè)實(shí)例來調(diào)用這個(gè)方法,要從Refectionclass對象取得類的一個(gè)實(shí)例, 
調(diào)用 它的newInstance()方法,然后再使用invoke()方法,返回實(shí)例傳入就可以。 
確定用于文章和側(cè)邊的類的成員 

復(fù)制代碼代碼如下:


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; 


創(chuàng)建一個(gè)實(shí)現(xiàn)了可選特性的反射式插件 

復(fù)制代碼代碼如下:


class MyCoolPlugin implements IPlugin{ 
public static function getName(){return 'MyCoolPlugin';} 
public static function getMenuItems(){ 
//菜單項(xiàng)的數(shù)字索引數(shù)組 
return array(array('description'=>'MyCoolPlugin','link'=>'/MyCoolPlugin')); 

public static function getArticles(){ 
//文章的數(shù)字索引數(shù)組 
return array(array('path'=>'/MyCoolPlugin','title'=>'This is a really cool article', 
'text'=>'This article is cool because...')); 

public static function getSideBars(){ 
//文章的側(cè)邊欄索引數(shù)組 
return array(array('sideBars'=>'/MyCoolPlugin')); 


最后只要這樣就可以使用這樣插件了: 

復(fù)制代碼代碼如下:


$menu=computeArticles(); 
$sidebars=computeSidebars(); 
$articles=computeArticles(); 
print_r($menu); 
print_r($sidebars); 
print_r($articles); 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久青草国产在视频在线观看 | 视频一区二区三区欧美日韩 | 亚洲国产成人综合 | 国产成人看片免费视频观看 | 天天天做天天天天爱天天想 | 国产在线极品 | 日本ww视频 | haodiaose在线精品免费观看 | 1024亚洲天堂 | lilisha李丽莎喷水大胆在线 | 人人爱天天做夜夜爽88 | 天天综合五月天 | 成人精品 | 欧美又大又粗又长又硬 | 女教师波多野结衣高清在线 | 91精品国产高清久久久久 | 国产精品夜色视频一级区 | 9热在线精品视频观看 | 精品亚洲综合在线第一区 | 欧美在线一二三区 | 95视频在线观看在线分类h片 | 天堂久久久久va久久久久 | 特黄特色大片免费高清视频 | 91网红福利精品区一区二 | 色哟哟在线视频 | 欧美午夜寂寞影院安卓列表 | 欧美巨胸 | chinese圣水黄金调教 | 大ji巴好好爽好深网站 | chinesespank调教 | 美国video | 黄+色+性+人免费 | 黑人巨鞭大战白妞10级 | 国产一卡2卡3卡四卡精品网站 | 日韩ab| 免费人成在线观看69式小视频 | 五月天婷婷亚洲 | 国产精品久久久久久久免费大片 | 好大好爽好舒服视频 | 小早川怜子亚洲综合中文字幕 | 久久九九久精品国产尤物 |