最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2010年05月18日 23:14:52   作者:  
基于反射的插件架構(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對(duì)象取得類的一個(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);

相關(guān)文章

  • 如何通過Apache在本地配置多個(gè)虛擬主機(jī)

    如何通過Apache在本地配置多個(gè)虛擬主機(jī)

    這篇文章主要介紹了如何通過Apache在本地配置多個(gè)虛擬主機(jī),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 提高PHP編程效率的方法

    提高PHP編程效率的方法

    PHP開發(fā)中需要注意的問題,這樣要吧提高PHP編程效率
    2013-11-11
  • PHP中引用類型和值類型功能與用法示例

    PHP中引用類型和值類型功能與用法示例

    這篇文章主要介紹了PHP中引用類型和值類型功能與用法,簡單分析了php引用類型和值類型的概念、功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-02-02
  • PHP解析配置文件的常用方法

    PHP解析配置文件的常用方法

    在PHP中解析配置文件有多種方法,具體取決于配置文件的格式,常見的配置文件格式包括INI文件、YAML文件、JSON文件以及PHP數(shù)組文件(即PHP文件本身包含配置數(shù)組),下面是一些常用的方法來解析這些配置文件,需要的朋友可以參考下
    2024-10-10
  • php更改目錄及子目錄下所有的文件后綴的代碼

    php更改目錄及子目錄下所有的文件后綴的代碼

    今天遇到要改變當(dāng)前目錄下指定類型的文件類型,本來想要用批處理來做這個(gè),結(jié)果沒找到合適。就自己去查了下資料,用Php來處理一下。
    2010-09-09
  • php使用curl獲取header檢測開啟GZip壓縮的方法

    php使用curl獲取header檢測開啟GZip壓縮的方法

    這篇文章主要介紹了php使用curl獲取header檢測開啟GZip壓縮的方法,結(jié)合實(shí)例形式總結(jié)分析了三種常見的header檢測方法并給出了使用curl檢測Gzip壓縮開啟情況的方法,需要的朋友可以參考下
    2018-08-08
  • 也談php網(wǎng)站在線人數(shù)統(tǒng)計(jì)

    也談php網(wǎng)站在線人數(shù)統(tǒng)計(jì)

    db層: db_online.PHP //該函數(shù)使用戶自己在線,并且檢查其他用戶的在線情況
    2008-04-04
  • 淺析php插件 HTMLPurifier HTML解析器

    淺析php插件 HTMLPurifier HTML解析器

    本篇文章是對(duì)php插件 HTMLPurifier HTML解析器進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • PHP實(shí)現(xiàn)添加圖片水印的示例代碼

    PHP實(shí)現(xiàn)添加圖片水印的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用PHP實(shí)現(xiàn)添加圖片水印并根據(jù)比例計(jì)算水印的新尺寸,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-11-11
  • PHP+mysql防止SQL注入的方法小結(jié)

    PHP+mysql防止SQL注入的方法小結(jié)

    這篇文章主要介紹了PHP+mysql防止SQL注入的方法,結(jié)合實(shí)例形式總結(jié)分析了php+mysql程序設(shè)計(jì)中SQL注入的原理與相應(yīng)的解決方法,需要的朋友可以參考下
    2019-04-04

最新評(píng)論

文昌市| 葵青区| 青川县| 南漳县| 错那县| 贵南县| 河东区| 屏东县| 漾濞| 甘肃省| 威宁| 金川县| 文水县| 新宾| 阳原县| 连南| 东乡县| 琼海市| 偃师市| 肇州县| 双峰县| 扎囊县| 深水埗区| 台东市| 东光县| 屏东市| 乐亭县| 图木舒克市| 乌兰察布市| 安西县| 遂川县| 台江县| 郧西县| 朔州市| 桂阳县| 通州市| 哈尔滨市| 垫江县| 唐海县| 阳曲县| 宜兴市|