反射機制簡介
- 之前已經介紹過Java反射機制的簡單使用,所有的反射機制的思想作用等都是類似的,下面就一起來了解一下PHP反射機制。
- 個人理解:反射機制就是可以利用類名或者一個類的對象來獲取關於這個類的一系列信息(類的變量,方法),然后又就可以利用得到的類的信息實例化一些類的對象
- 官方給的簡介:反射 API,有 對類、接口、函數、方法和擴展進行反向工程的能力。 此外,反射 API 提供了方法來取出函數、類和方法中的文檔注釋。
- 一般在框架中使用到反射機制比較多(控制反轉),正常情況下一般使用不到反射的
反射機制的使用
-
常用的類
- ReflectionClass 通過類名獲取類的信息
- ReflectionObject 通過類的對象獲取類的信息
-
代碼,還以之前介紹Java反射的Worker類為例
worker.php:
<?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 在一個文件夾下<?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));
除了這些外,PHP反射還有其他的功能,具體可參考PHP手冊的反射部分
如需轉載請注明出處:http://www.cnblogs.com/zhuchenglin/p/8890451.html