反射

問題描述:

函數(shù)接收的一個參數(shù)存儲了類名,想要動態(tài)的new出該類,并調(diào)用類中的方法

解決辦法:使用php中的反射類

反射是指在PHP運行狀態(tài)中,擴展分析PHP程序,導(dǎo)出或提出關(guān)于類、方法、屬性、參數(shù)等的詳細信息,包括注釋。這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為反射API。

反射機制可以利用類名或者一個類的對象來獲取關(guān)于這個類的一系列信息(類的變量,方法),然后又就可以利用得到的類的信息實例化一些類的對象。

正是因為類的反射,很多PHP框架才能實現(xiàn)依賴注入自動解決類與類之間的依賴關(guān)系,這給我們平時的開發(fā)帶來了很大的方便。

/ 首先必須引入反射類
use ReflectionClass;
 
class Plan
{
    public function display(Request $request){
        $param = $request->param();
                //使用反射  建立 Ipmodel這個類的反射類
        $class = new ReflectionClass('app\index\controller\Ipmodel'); 
        $instance = $class->newInstance();  // 實例化
        $result = $instance->dataOut($param['plan_id']);   // 調(diào)用類中的方法dataOut
        $attr = $class->getConstant('CONFIG');           // 獲取類中的屬性CONFIG
 
        $resData['code'] = 200;
        $resData['data'] = $result;
        return $resData;
    }
}
//或者使用以下方法獲取總列表
getMethods
getProperties
這里重點注意的是:

1:必須記得引入ReflectionClass

2:創(chuàng)建反射類時傳送的類名,如果當前不在同一文件, 則必須包含完整的命名空間,即使使用了 use 關(guān)鍵字。否則找不到類名會拋出異常。

通過ReflectionClass,我們可以得到Person類的以下信息:
1)常量 Contants
2)屬性 Property Names
3)方法 Method Names靜態(tài)
4)屬性 Static Properties
5)命名空間 Namespace
6) Person類是否為final或者abstract

反射API提供的常用類和函數(shù):
 1:Reflection
   public static export(Reflector r [,bool return])//打印類或方法的詳細信息
   public static  getModifierNames(int modifiers)  //取得修飾符的名字
 
 2:ReflectionMethod:
     public static string export()                       //打印該方法的信息
     public mixed invoke(stdclass object, mixed* args)   //調(diào)用對應(yīng)的方法
     public mixed invokeArgs(stdclass object, array args)//調(diào)用對應(yīng)的方法,傳多參數(shù)
     public bool isFinal()        //方法是否為final
     public bool isAbstract()     //方法是否為abstract
     public bool isPublic()       //方法是否為public
     public bool isPrivate()      //方法是否為private
     public bool isProtected()    //方法是否為protected
     public bool isStatic()       //方法是否為static
     public bool isConstructor()  //方法是否為構(gòu)造函數(shù)
 
 3:ReflectionClass:
     public static string export()  //打印類的詳細信息
     public string getName()        //取得類名或接口名
     public bool isInternal()       //類是否為系統(tǒng)內(nèi)部類
     public bool isUserDefined()    //類是否為用戶自定義類
     public bool isInstantiable()   //類是否被實例化過
     public bool hasMethod(string name)  //類是否有特定的方法
     public bool hasProperty(string name)//類是否有特定的屬性
     public string getFileName()         //獲取定義該類的文件名,包括路徑名
     public int getStartLine()           //獲取定義該類的開始行
     public int getEndLine()             //獲取定義該類的結(jié)束行
     public string getDocComment()       //獲取該類的注釋
     public ReflectionMethod getConstructor()           //取得該類的構(gòu)造函數(shù)信息
     public ReflectionMethod getMethod(string name)     //取得該類的某個特定的方法信息
     public ReflectionMethod[] getMethods()             //取得該類的所有的方法信息
     public ReflectionProperty getProperty(string name) //取得某個特定的屬性信息
     public ReflectionProperty[] getProperties()        //取得該類的所有屬性信息
     public array getConstants()                        //取得該類所有常量信息
     public mixed getConstant(string name)              //取得該類特定常量信息
     public ReflectionClass[] getInterfaces()           //取得接口類信息
     public bool isInterface()  //測試該類是否為接口
     public bool isAbstract()   //測試該類是否為抽象類
 
 4:ReflectionParameter:
     public static string export()     //導(dǎo)出該參數(shù)的詳細信息
     public string getName()           //取得參數(shù)名
     public bool isPassedByReference() //測試該參數(shù)是否通過引用傳遞參數(shù)
     public ReflectionClass getClass() //若該參數(shù)為對象,返回該對象的類名
     public bool isArray()             //測試該參數(shù)是否為數(shù)組類型
     public bool allowsNull()          //測試該參數(shù)是否允許為空
     public bool isOptional()          //測試該參數(shù)是否為可選的,當有默認參數(shù)時可選
     public bool isDefaultValueAvailable() //測試該參數(shù)是否為默認參數(shù)
     public mixed getDefaultValue()        //取得該參數(shù)的默認值
 
 5:ReflectionExtension類
     public static  export()    //導(dǎo)出該擴展的所有信息
     public string getName()    //取得該擴展的名字
     public string getVersion() //取得該擴展的版本
     public ReflectionFunction[] getFunctions()   //取得該擴展的所有函數(shù)
     public array getConstants()  //取得該擴展的所有常量
     public array getINIEntries() //取得與該擴展相關(guān)的,在php.ini中的指令信息

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容