激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - PHP教程 - 在PHP中使用反射技術的架構插件使用說明

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

2019-10-30 16:25php教程網 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); 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 嗯~啊~用力~高h | 国产品久久 | 国产98色在线 | 日本一级黄色大片 | 爽爽视频免费看 | 欧美精品一区二区视频 | 激情九九| 夜夜夜精品视频 | 久久激情免费视频 | 免费在线观看成人av | 女人裸体让男人桶全过程 | 色天使中文字幕 | 国产亚洲精品视频中文字幕 | 久久色播 | 97精品国产高清在线看入口 | 日本欧美一区二区三区在线观看 | 99精品国产一区二区三区 | 欧美日韩亚洲一区二区三区 | 国产精品视频六区 | 成人午夜视频在线观看免费 | japanese xxxxhd| 成人一级黄色大片 | 久久久久成人网 | 亚洲欧美一区二区三区在线观看 | asian裸体佳人pics | 中文字幕精品在线观看 | 天天躁狠狠躁夜躁2020挡不住 | 亚欧美一区二区 | 欧美成人精品一级 | 色婷婷久久一区二区 | 色综合精品 | 国产成人精品免高潮在线观看 | 日本一区二区免费在线观看 | 欧美城网站地址 | 国产免费v片 | 黄色毛片一级视频 | 最新中文字幕日本 | 色偷偷欧美 | 91精品国产网站 | 黄在线观看在线播放720p | 一级免费黄色 |