一个色综合导航,欧美午夜一区二区三区免费大片 ,亚洲国产精品va在看黑人 http://www.18av-77.com/blog 中山php|最優(yōu)網(wǎng)絡(luò) Mon, 13 May 2013 04:56:43 +0000 en hourly 1 http://wordpress.org/?v=3.1.4 什么是php反射機(jī)制以及利用php反射機(jī)制實(shí)現(xiàn)可插拔可擴(kuò)展的插件架構(gòu) http://www.18av-77.com/blog/view-205.html http://www.18av-77.com/blog/view-205.html#comments Thu, 25 Aug 2011 16:06:34 +0000 lin http://www.18av-77.com/blog/?p=205 反射是什么?
它是指在PHP運(yùn)行狀態(tài)中,擴(kuò)展分析PHP程序,導(dǎo)出或提取出關(guān)于類、方法、屬性、參數(shù)等的詳細(xì)信息,包括注釋。這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為反射API。

反射是操縱面向?qū)ο蠓缎椭性P偷腁PI,其功能十分強(qiáng)大,可幫助我們構(gòu)建復(fù)雜,可擴(kuò)展的應(yīng)用。其用途如:自動加載插件,自動生成文檔,甚至可用來擴(kuò)充PHP語言。php反射api由若干類組成,可幫助我們用來訪問程序的元數(shù)據(jù)或者同相關(guān)的注釋交互。借助反射我們可以獲取諸如類實(shí)現(xiàn)了那些方法,創(chuàng)建一個類的實(shí)例(不同于用new創(chuàng)建),調(diào)用一個方法(也不同于常規(guī)調(diào)用),傳遞參數(shù),動態(tài)調(diào)用類的靜態(tài)方法。
*
**
反射api是php內(nèi)建的oop技術(shù)擴(kuò)展,包括一些類,異常和接口,綜合使用他們可用來幫助我們分析其它類,接口,方法,屬性,方法和擴(kuò)展。這些oop擴(kuò)展被稱為反射,位于php源碼/ext/reflection目錄下。

可以使用反射api自省反射api本身(這可能就是反射最初的意思,自己"看"自己):
<?php
Reflection::export(new ReflectionExtension('reflection'));
?>
幾乎所有的反射api都實(shí)現(xiàn)了reflector接口,所有實(shí)現(xiàn)該接口的類都有一個export方法,該方法打印出參數(shù)對象的相關(guān)信息。
使用get_declared_classes()獲取所有php內(nèi)置類,get_declared_interfaces();
get_defined_functions();
get_defined_vars(); get_defined_constants();可獲取php接口,方法,變量,常量信息。

**
***
反射初探:
<?php
//定義一個自定義類
class MyTestClass{

public function testFunc($para0='defaultValue0'){

}
}
//接下來反射它
foreach(get_declared_classes() as $class){
//實(shí)例化一個反射類
$reflectionClass = new ReflectionClass($class);
//如果該類是自定義類
if($reflectionClass->isUserDefined()){
//導(dǎo)出該類信息
Reflection::export($reflectionClass);
}
}
?>
以上片段實(shí)例如何查看自定義類的基本信息。
描述數(shù)據(jù)的數(shù)據(jù)被稱為元數(shù)據(jù),用反射獲取的信息就是元數(shù)據(jù)信息,這些信息用來描述類,接口方法等等。(元---》就是原始之意,比如元模型就是描述模型的模型,比如UML元模型就是描述UML結(jié)構(gòu)的模型),元數(shù)據(jù)進(jìn)一步可分為硬元數(shù)據(jù)(hard matadata)和軟元數(shù)據(jù)(soft metadata),前者由編譯代碼導(dǎo)出,如類名字,方法,參數(shù)等。
后者是人為加入的數(shù)據(jù),如phpDoc塊,php中的屬性等。
***
****
現(xiàn)在商業(yè)軟件很多都是基于插件架構(gòu)的,比如eclipse,和visual studio,netbeans等一些著名IDE都是基于插件的GUI應(yīng)用。第三方或本方開發(fā)插件時,必須導(dǎo)入定義好的相關(guān)接口,然后實(shí)現(xiàn)這些接口,最后把實(shí)現(xiàn)的包放在指定目錄下,宿主應(yīng)用程序在啟動時自動檢測所有的插件實(shí)現(xiàn),并加載它們。如果我們自己想實(shí)現(xiàn)這樣的架構(gòu)也是可能的。
<?php
//先定義UI接口
interface IPlugin {
//獲取插件的名字
public static function getName();
//要顯示的菜單項(xiàng)
function getMenuItems();
//要顯示的文章
function getArticles();
//要顯示的導(dǎo)航欄
function getSideBars();
}
//一下是對插件接口的實(shí)現(xiàn)
class SomePlugin implements IPlugin {
public function getMenuItems() {
//返回菜單項(xiàng)
return null;
}
public function getArticles() {
//返回我們的文章
return null;
}
public function getSideBars() {
//我們有一個導(dǎo)航欄
return array('SideBarItem');
}
//返回插件名
public static function getName(){
return "SomePlugin";
}
}
?>
php中也有使用插件的解決方案,不像eclipse。

使用我們的插件:1.先使用get_declared_classes()獲取所有已加載類。2.遍歷所有類,判斷其是否實(shí)現(xiàn)了我們自定義的插件接口IPlugin。3.獲取所有的插件實(shí)現(xiàn)。4.在宿主應(yīng)用中與插件交互
下面這個方法幫助我們找到實(shí)現(xiàn)了插件接口的所有類:
function findPlugins() {
$plugins = array();
foreach(get_declared_classes() as $class) {
$reflectionClass = new ReflectionClass($class);
//判斷一個類是否實(shí)現(xiàn)了IPlugin接口
if($reflectionClass->implementsInterface('IPlugin')) {
$plugins[] = $reflectionClass;
}
}
return $plugins;
}
注意到所有的插件實(shí)現(xiàn)是作為反射類實(shí)例返回的,而不是類名本身,或是類的實(shí)例。因?yàn)槿绻褂梅瓷鋪碚{(diào)用方法還需要一些條件判斷。

判斷一個類是否實(shí)現(xiàn)了某個方法使用反射類的hasMethod()方法。
接下來我們把所有的插件菜單項(xiàng)放在一個菜單上。
function integratePlugInMenus() {
$menu = array();
//遍歷所有的插件實(shí)現(xiàn)
foreach(findPlugins() as $plugin) {
//判斷插件是否實(shí)現(xiàn)了getMenuItems方法
if($plugin->hasMethod('getMenuItems')) {
/*實(shí)例化一個方法實(shí)例(注意當(dāng)你將類和方法看成概念時,它們就可以有實(shí)例,就像"人"這個概念一樣),該方法返回的是ReflectionMethod的實(shí)例*/
$reflectionMethod = $plugin->getMethod('getMenuItems');
//如果方法是靜態(tài)的
if($reflectionMethod->isStatic()) {
//調(diào)用靜態(tài)方法,注意參數(shù)是null而不是一個反射類實(shí)例
$items = $reflectionMethod->invoke(null);
} else {
//如果方法不是靜態(tài)的,則先實(shí)例化一個反射類實(shí)例所代表的類的實(shí)例。
$pluginInstance = $plugin->newInstance();
//使用反射api來調(diào)用一個方法,參數(shù)是通過反射實(shí)例化的對象引用
$items = $reflectionMethod->invoke($pluginInstance);
}
//合并所有的插件菜單項(xiàng)為一個菜單。
$menu = array_merge($menu, $items);
}
}
return $menu;
}
這里主要用到的反射方法實(shí)例的方法調(diào)用:
public mixed invoke(stdclass object, mixed args=null);
請一定搞清楚我們常規(guī)方法的調(diào)用是這種形式:$objRef->someMethod($argList...);
因?yàn)槭褂昧朔瓷洌@時你在想調(diào)用一個方法時形式變?yōu)椋?br /> $reflectionMethodRef->invoke($reflectionClassRef,$argList...);
如果使用反射調(diào)用方法,我們必須實(shí)例化一個反射方法的實(shí)例,如果是實(shí)例方法還要有一個實(shí)例的引用,可能還需傳遞必要的參數(shù)。當(dāng)調(diào)用一個靜態(tài)方法時,顯式傳入null作為第一參數(shù)。
對插件類實(shí)現(xiàn)的其他方法有類似的處理邏輯,這里不再敷述。
以下是我的一個簡單測試:
<?php
/**
* 定義一個插件接口
* */
interface IPlugIn
{
/**
* getSidebars()
*
* @return 返回側(cè)導(dǎo)航欄
*/
public function getSidebars();
/**
* GetName()
*
* @return 返回類名
*/
public static function GetName();
}

/*下面是對插件的實(shí)現(xiàn),其實(shí)應(yīng)該放在不同的文件中,甚至是不同的包中*/
class MyPlugIn implements IPlugIn
{
public function getSidebars()
{
//構(gòu)造自己的導(dǎo)航欄
$sideBars = '<div><ul >
<li><a href="">m1</a>
</li>
<li><a href="">m2</a>
</li>
</ul>
</div>';
return $sideBars;
}
public static function GetName()
{
return 'MyPlugIn';
}
}
//第二個插件實(shí)現(xiàn);
class MyPlugIn2 implements IPlugIn
{
public function getSidebars()
{
//構(gòu)造自己的導(dǎo)航欄
$sideBars = '<div><ul >
<li><a href="">mm1</a>
</li>
<li><a href="">mm2</a>
</li>
</ul>
</div>';
return $sideBars;
}
public static function GetName()
{
return 'MyPlugIn2';
}
}

//在宿主程序中使用插件
class HostApp
{

public function initAll()
{
// 初始化各個部分
echo "yiqing95.";
$this->renderAll();
}
//渲染GUI格部分
function renderAll(){
$rsltSidebars="<table>";
foreach($this->integrateSidebarsOfPlugin() as $sidebarItem){
$rsltSidebars.="<tr><td>$sidebarItem</td></tr>";
}
$rsltSidebars.="</table>";

echo $rsltSidebars;
}
/*加載所有的插件實(shí)現(xiàn):*/
protected function findPlugins()
{
$plugins = array();
foreach (get_declared_classes() as $class) {
$reflectionClass = new ReflectionClass($class);
if ($reflectionClass->implementsInterface('IPlugin')) {
$plugins[] = $reflectionClass;
}
}
return $plugins;
}
/**加載組裝所有插件實(shí)現(xiàn)***/
protected function integrateSidebarsOfPlugin()
{
$sidebars = array();
foreach ($this->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);
$sidebars[]=$items;
}
return $sidebars;
}

}
//運(yùn)行程序:
$entryClass =new HostApp();
$entryClass->initAll();
?>
****
××××
$reflectionClass = new ReflectionClass("IPlugIn");
echo $reflectionClass-> getDocComment();
這段代碼可以幫助我們獲取類的文檔注釋,一旦我們獲取了類的注釋內(nèi)容我們就可以擴(kuò)展我們的類功能,比如先獲取注釋,然后分析注釋使用docblock tokenizer 『pecl擴(kuò)展』,或使用自帶的Tokenizer類又或者使用正則表達(dá)式,字符串函數(shù)來解析注釋文檔,你可以在注釋中加入任何東西,包括指令,在使用反射調(diào)用前可判斷這些通過注釋傳遞的指令或數(shù)據(jù):
<?php
//"分析相關(guān)的注釋數(shù)據(jù)"
analyse($reflectionClass-> getDocComment());//analyse是自己定義的!!!
//根據(jù)分析的結(jié)果來執(zhí)行方法,或者傳遞參數(shù)等
if(xxxx){
$reflectionMethod->invoke($pluginInstance) ;
}
?>
因?yàn)樽⑨尞吘故亲址梢允褂萌魏巫址馕黾夹g(shù),提取有用的信息,再根據(jù)這些信息來調(diào)用方法,就是說程序的邏輯不光可由方法實(shí)現(xiàn)決定,還可能由注釋決定(前提是你使用了反射,注釋格式嚴(yán)格有要求)。
××××
*****
反射api和其他類一樣可被繼承擴(kuò)展,所以我們可以為這些api添加自己的功能。結(jié)合自定義注釋標(biāo)記。就是以@開頭的東東,標(biāo)注(Java中稱為annotation),.net中稱為屬性attribute(或稱為特性)。然后擴(kuò)展Reflection類,就可以實(shí)現(xiàn)強(qiáng)大的擴(kuò)展功能了。
值得一提的是工廠方法設(shè)計模式(GOF之一),也常使用反射來實(shí)例化對象,下面是示例性質(zhì)的偽碼:
Class XXXFactory{
function getInstance($className){
$reflectionClass =new ReflectionClass($className);
return $reflectionClass->newInstance();
}
//使用接口的那個類實(shí)現(xiàn),可能來自配置文件
function getInstance(){
$pathOfConfig = "xxx/xx/XXXImplement.php";
$className= Config->getItem($pathOfClass,'SomeClassName');
return $this->getInstance($className);
}
}
*****

]]>
http://www.18av-77.com/blog/view-205.html/feed 406
久久er精品视频_先锋影院在线亚洲_影音先锋一区_性色av香蕉一区二区
欧美日本免费一区二区三区| 久久99在线观看| 欧美午夜一区二区| 亚洲免费一区二区| 久久久久国产一区二区三区| 在线日韩精品视频| 欧美激情一区二区三区高清视频 | 欧美激情精品久久久久久免费印度| 亚洲第一网站免费视频| 欧美日韩一区国产| 欧美一区二区三区在| 欧美大胆a视频| 亚洲图片欧美午夜| 国产综合色产在线精品| 欧美激情aaaa| 欧美一区二区三区免费看| 欧美国产丝袜视频| 亚洲永久网站| 1769国内精品视频在线播放| 欧美激情影音先锋| 欧美一区激情| 日韩午夜电影av| 久久综合中文| 亚洲欧美日韩国产中文| 亚洲国产日韩欧美在线99| 国产精品成人一区二区三区夜夜夜| 久久久久国产精品厨房| 中文一区二区| 亚洲成人在线视频播放 | 欧美成ee人免费视频| 亚洲一区二区三区中文字幕| 免费日韩视频| 欧美在线高清| 一区二区三区免费网站| 在线观看日韩欧美| 国产精品视频午夜| 欧美日韩99| 蜜乳av另类精品一区二区| 韩国成人理伦片免费播放| 欧美国产视频在线| 亚洲欧美中文在线视频| 亚洲精品麻豆| 欧美sm重口味系列视频在线观看| 亚洲综合首页| 亚洲乱码久久| 亚洲国产成人av好男人在线观看| 国产精品乱码一区二三区小蝌蚪| 欧美成黄导航| 久久久亚洲国产美女国产盗摄| 一区二区三区产品免费精品久久75 | 亚洲手机视频| 亚洲精品中文字幕女同| 亚洲高清自拍| 激情视频一区二区| 国产精品乱子久久久久| 久热精品视频在线| 欧美一区二区三区播放老司机 | 久久久久www| 亚洲女性喷水在线观看一区| 一区二区三区视频在线| 亚洲精品乱码久久久久久| 在线精品一区| 在线日韩中文| 亚洲国产精品va在线观看黑人 | 一区二区三区 在线观看视频| 亚洲日本免费| 亚洲精品美女在线观看| 亚洲精品视频一区| 亚洲精品视频中文字幕| 亚洲美女少妇无套啪啪呻吟| 亚洲韩国精品一区| 亚洲精品免费在线播放| 亚洲三级影片| 在线视频你懂得一区| 亚洲天堂av在线免费观看| 中文亚洲字幕| 午夜免费久久久久| 久久av一区| 麻豆久久久9性大片| 欧美1区3d| 欧美日韩一区二区免费在线观看 | 雨宫琴音一区二区在线| 亚洲成人在线免费| 亚洲精品久久久蜜桃| av不卡在线观看| 亚洲一区图片| 久久久xxx| 欧美电影在线播放| 亚洲免费电影在线观看| 亚洲一区二区久久| 久久激情中文| 欧美黄色一区二区| 国产精品伦理| 伊人久久男人天堂| 一本色道久久综合狠狠躁的推荐| 亚洲午夜精品网| 久久久一二三| 亚洲精品日韩激情在线电影| 亚洲自拍都市欧美小说| 久久久久免费| 欧美日韩视频| 红桃av永久久久| 亚洲作爱视频| 久久精品免费| 亚洲日韩欧美视频一区| 午夜欧美精品| 欧美国产视频日韩| 国产热re99久久6国产精品| 有坂深雪在线一区| 亚洲欧美国产三级| 欧美mv日韩mv国产网站app| 99在线热播精品免费| 久久国产精品久久久久久| 欧美人成在线视频| 国内精品99| 亚洲男人的天堂在线| 欧美高潮视频| 亚洲欧美一区二区视频| 欧美激情视频免费观看| 国产视频自拍一区| 在线亚洲成人| 欧美成人蜜桃| 性视频1819p久久| 欧美日韩中文| 亚洲人成网站影音先锋播放| 欧美综合国产| 国产精品99久久久久久白浆小说| 久久人人爽人人爽爽久久| 国产精品亚洲成人| 夜夜爽av福利精品导航| 欧美成人精精品一区二区频| 亚洲欧美文学| 国产精品vvv| 99精品国产在热久久| 免费观看成人| 欧美在线观看一区| 国产精品入口夜色视频大尺度| 亚洲高清视频一区二区| 久久久久久夜| 亚洲欧美视频在线| 国产精品久久久久一区二区三区| 亚洲精品永久免费| 欧美黄色成人网| 久久青青草原一区二区| 国产综合视频| 久久久www免费人成黑人精品 | 亚洲国产精品久久人人爱蜜臀| 久久av二区| 午夜在线精品偷拍| 国产精品亚洲第一区在线暖暖韩国| 亚洲一二三区精品| 日韩亚洲一区在线播放| 欧美日韩成人一区| 99在线精品视频| 91久久精品网| 欧美日韩成人综合| 99re在线精品| 99国产精品自拍| 国产精品久久久久9999吃药| 亚洲字幕在线观看| 亚洲一区观看| 国产永久精品大片wwwapp| 久久久人成影片一区二区三区观看 | 欧美日韩亚洲天堂| 这里只有精品丝袜| 在线视频一区二区| 国产精品婷婷午夜在线观看| 欧美在线啊v一区| 久久国产毛片| 最新日韩欧美| 99热免费精品在线观看| 国产精品美女久久久久av超清| 亚洲欧美另类在线观看| 亚洲素人一区二区| 国产精品亚发布| 欧美一区日本一区韩国一区| 欧美在线视频播放| 黄色欧美日韩| 欧美在线国产| 久久婷婷激情| 91久久在线播放| 久久精品国产精品| 久久综合综合久久综合| 最新高清无码专区| 亚洲欧洲在线观看| 国产精品视频一二| 久久久91精品国产一区二区精品| 欧美一区二区视频在线观看| 亚洲国产婷婷| 亚洲毛片在线免费观看| 欧美视频四区| 毛片av中文字幕一区二区| 狼狼综合久久久久综合网| 亚洲激情自拍| 亚洲国产你懂的| 国产欧美在线视频| 蜜桃久久av一区| 欧美日韩精品高清| 久久精品观看| 午夜精品电影|