php 反射類簡介

2021-06-17 17:16:05 字數 2999 閱讀 7278

php反射(

*反射是操縱物件導向范型中元模型的api,其功能十分強大,可幫助我們構建複雜,可擴充套件的應用。其用途如:自動載入外掛程式,自動生成文件,甚至可用來擴充php語言。php反射api由若干類組成,可幫助我們用來訪問程式的元資料或者同相關的注釋互動。借助反射我們可以獲取諸如類實現了那些方法,建立乙個類的例項(不同於用new建立),呼叫乙個方法(也不同於常規呼叫),傳遞引數,動態呼叫類的靜態方法。***

反射api是php內建的oop技術擴充套件,包括一些類,異常和介面,綜合使用他們可用來幫助我們分析其它類,介面,方法,屬性,方法和擴充套件。這些oop擴充套件被稱為反射,位於php原始碼/ext/reflection目錄下。

可以使用反射api自省反射api本身(這可能就是反射最初的意思,自己「看」自己):

<?php

reflection::export(new reflectionextension('reflection'));

?>

幾乎所有的反射api都實現了reflector介面,所有實現該介面的類都有乙個export方法,該方法列印出引數物件的相關資訊。

使用get_declared_classes()獲取所有php內建類,get_declared_inte***ces();

get_defined_functions();

get_defined_vars(); get_defined_constants();可獲取php介面,方法,變數,常量資訊。

*****

反射初探:

<?php

//定義乙個自定義類

class mytestclass

}//接下來反射它

foreach(get_declared_classes() as $class)

}?>

以上片段例項如何檢視自定義類的基本資訊。

描述資料的資料被稱為元資料,用反射獲取的資訊就是元資料資訊,這些資訊用來描述類,介面方法等等。(元---》就是原始之意,比如元模型就是描述模型的模型,比如uml元模型就是描述uml結構的模型),元資料進一步可分為硬元資料(hard matadata)和軟元資料(soft metadata),前者由編譯**匯出,如類名字,方法,引數等。

後者是人為加入的資料,如phpdoc塊,php中的屬性等。

*******

現在商業軟體很多都是基於外掛程式架構的,比如eclipse,和visual studio,netbeans等一些著名ide都是基於外掛程式的gui應用。第三方或本方開發外掛程式時,必須匯入定義好的相關介面,然後實現這些介面,最後把實現的包放在指定目錄下,宿主應用程式在啟動時自動檢測所有的外掛程式實現,並載入它們。如果我們自己想實現這樣的架構也是可能的。

<?php

//先定義ui介面

inte***ce iplugin

//一下是對外掛程式介面的實現

class someplugin implements iplugin

public function getarticles()

public function getsidebars()

//返回外掛程式名

public static function getname()

}?>

php中也有使用外掛程式的解決方案,不像eclipse。

使用我們的外掛程式:1.先使用get_declared_classes()獲取所有已載入類。2.遍歷所有類,判斷其是否實現了我們自定義的外掛程式介面iplugin。3.獲取所有的外掛程式實現。4.在宿主應用中與外掛程式互動

下面這個方法幫助我們找到實現了外掛程式介面的所有類:

function findplugins()

}return $plugins;

}注意到所有的外掛程式實現是作為反射類例項返回的,而不是類名本身,或是類的例項。因為如果使用反射來呼叫方法還需要一些條件判斷。

判斷乙個類是否實現了某個方法使用反射類的hasmethod()方法。

接下來我們把所有的外掛程式選單項放在乙個選單上。

function integratepluginmenus() else

//合併所有的外掛程式選單項為乙個選單。

$menu = array_merge($menu, $items);}}

return $menu;

}這裡主要用到的反射方法例項的方法呼叫:

public mixed invoke(stdclass object, mixed args=null);

請一定搞清楚我們常規方法的呼叫是這種形式:$objref->somemethod($arglist...);

因為使用了反射,這時你在想呼叫乙個方法時形式變為:

$reflectionmethodref->invoke($reflectionclassref,$arglist...);

如果使用反射呼叫方法,我們必須例項化乙個反射方法的例項,如果是例項方法還要有乙個例項的引用,可能還需傳遞必要的引數。當呼叫乙個靜態方法時,顯式傳入null作為第一引數。

對外掛程式類實現的其他方法有類似的處理邏輯,這裡不再敷述。

以下是我的乙個簡單測試:

<?php

/*** 定義乙個外掛程式介面

* */

inte***ce iplugin

/*下面是對外掛程式的實現,其實應該放在不同的檔案中,甚至是不同的包中*/

class myplugin implements iplugin

public static function getname()

}//第二個外掛程式實現;

class myplugin2 implements iplugin

public static function getname()

}public function initall()

//渲染gui格部分

function renderall(){

$rsltsidebars="";

foreach($this->integratesidebarsofplugin() as $sidebaritem){

$rsltsidebars.="$sidebaritem

**:

PHP 反射類學習記錄

windows tp5參考文件 新建乙個測試反射類 testreflection.php user 一秋 date 2017 11 23 time 16 29 desc 成功 於點滴 class testreflection public function add 在新建 乙個類 test.php ...

PHP反射類基本應用

created by phpstorm.user gover chan date 2020 1 19 time 15 28 namespace extend use reflectionclass class user package extend author gover chan date 20...

反射簡介 C 特性和反射

net編譯器的任務之一就是為所有定義和引用的型別生成元資料描述。除了程式集中標準的元資料外,net平台還支援特定 attribute 把更多的元資料嵌入到程式集中。net特性擴充套件了抽象的system.attribute基類,net中有很多預定義的特性,例如 dllimport obsolete ...