反射機制簡介
之前已經介紹過Java反射機制的簡單使用,所有的反射機制的思想作用等都是類似的,下面就一起來了解一下PHP反射機制。
個人了解:反射機制就是可以利用類名或者一個類的對象來擷取關于這個類的一系列資訊(類的變量,方法),然後又就可以利用得到的類的資訊執行個體化一些類的對象
官方給的簡介:反射 API,有 對類、接口、函數、方法和擴充進行反向工程的能力。 此外,反射 API 提供了方法來取出函數、類和方法中的文檔注釋。
一般在架構中使用到反射機制比較多(控制反轉),正常情況下一般使用不到反射的
反射機制的使用
常用的類
ReflectionClass 通過類名擷取類的資訊
ReflectionObject 通過類的對象擷取類的資訊
代碼,還以之前介紹Java反射的Worker類為例
worker.php:
class Worker{
//勞工的一些屬性
private $name_;
private $age_;
private $salary_;
//構造方法
public function __construct($name,$age,$salary){
$this->name_ = $name;
$this->age_ = $age;
$this->salary_ = $salary;
}
//輸出勞工資訊的方法
public function show(){
echo "年齡".$this->salary_;
echo "姓名".$this->name_;
echo "工資".$this->salary_;
}
//__toString方法
public function __toString(){
return "年齡:".$this->age.",姓名:".$this->name."工資:".$this->salary;
}
}
下面可以通過反射機制擷取類的資訊
注 getObjectOfRuntimeClass.php 該檔案和worker.php 在一個檔案夾下
include 'worker.php';
//通過類名擷取
$workClass_by_classname = new ReflectionClass('Worker');
//通過類的執行個體對象擷取
$w = new Worker("小明",20,20);
$workerClass_by_classinstance = new ReflectionObject($w);
//因為ReflectionObject是ReflectionClass的子類,是以workClass_by_classname的方法,workerClass_by_classinstance同樣适用
//下面利用workClass_by_classname對象擷取類的一些屬性
//擷取類名
echo $workClass_by_classname->getName();
//擷取類的方法清單
var_dump($workClass_by_classname->getMethods());
//擷取類的屬性
var_dump($workClass_by_classname->getProperties());
//利用反射得到方法,并執行該方法
$worker = $workClass_by_classname->newInstance("小明",20,20);
$show_method = new ReflectionMethod('Worker','show');
$show_method->invoke($worker);
//利用反射機制得到屬性,并設定值
$property = $workClass_by_classname->getProperty('name_');
$property->setAccessible(true);
var_dump($property->getValue($worker));
$property->setValue($worker ,'小紅');
var_dump($property->getValue($worker));
參考:https://www.cnblogs.com/phpper/p/8452520.html
除了這些外,PHP反射還有其他的功能,具體可參考PHP手冊的反射部分
如需轉載請注明出處:http://www.cnblogs.com/zhuchenglin/p/8890451.html