問題描述:
函數(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中的指令信息