国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看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); 

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲人成免费网站 | 黄色欧美视频 | 97av在线 | 天堂中文视频在线观看 | 日韩欧美一区二区三区 | 免费成人黄色网址 | 最新电影在线高清免费完整观看视频 | 成人午夜精品一区二区三区 | 亚洲国产高清美女在线观看 | 国产高清视频在线 | 中文字幕在线第一页 | 亚洲在线电影 | 国产精品美女久久久久久久网站 | 日韩毛片免费在线观看 | 久久精品国产一区二区三区不卡 | 精品一区二区三区免费视频 | 国产美女精品视频免费观看 | 999精品视频 | 日本精品网 | 毛片网站免费在线观看 | 成人日韩 | 超碰偷拍 | av免费网| 欧洲av一区二区 | 日韩中文字幕在线观看 | 欧美日韩在线免费观看 | 国产尤物一区 | 黄色裸体网站 | 国产成年人在线观看 | 亚洲综合自拍 | 午夜久久久 | 国产精品第一国产精品 | 亚洲一区国产 | www.99精品 | 在线观看欧美一区 | 色视频www在线播放国产人成 | 久久九九国产精品 | 久久老妇| 五月婷婷激情网 | 久久91 | 亚洲精品一区在线观看 |