- 以前已經介紹過Java反射機制的簡單使用,全部的反射機制的思想做用等都是相似的,下面就一塊兒來了解一下PHP反射機制。
- 我的理解:反射機制就是能夠利用類名或者一個類的對象來獲取關於這個類的一系列信息(類的變量,方法),而後又就能夠利用獲得的類的信息實例化一些類的對象
- 官方給的簡介:反射 API,有 對類、接口、函數、方法和擴展進行反向工程的能力。 此外,反射 API 提供了方法來取出函數、類和方法中的文檔註釋。
- 通常在框架中使用到反射機制比較多(控制反轉),正常狀況下通常使用不到反射的
反射機制的使用
- 經常使用的類
- ReflectionClass 經過類名獲取類的信息
- ReflectionObject 經過類的對象獲取類的信息
-
代碼,還以以前介紹Java反射的Worker類爲例php
worker.php:html
1 <?php 2 3 class Worker{ 4 //工人的一些屬性 5 private $name_; 6 private $age_; 7 private $salary_; 8 9 //構造方法 10 public function __construct($name,$age,$salary){ 11 $this->name_ = $name; 12 $this->age_ = $age; 13 $this->salary_ = $salary; 14 } 15 //輸出工人信息的方法 16 public function show(){ 17 echo "年齡".$this->salary_; 18 echo "姓名".$this->name_; 19 echo "工資".$this->salary_; 20 } 21 22 //__toString方法 23 public function __toString(){ 24 return "年齡:".$this->age.",姓名:".$this->name."工資:".$this->salary; 25 } 26 27 }
下面能夠經過反射機制獲取類的信息
注 getObjectOfRuntimeClass.php 該文件和worker.php 在一個文件夾下markdown1 <?php 2 include 'worker.php'; 3 //經過類名獲取 4 $workClass_by_classname = new ReflectionClass('Worker'); 5 6 //經過類的實例對象獲取 7 $w = new Worker("小明",20,20); 8 $workerClass_by_classinstance = new ReflectionObject($w); 9 10 //由於ReflectionObject是ReflectionClass的子類,因此workClass_by_classname的方法,workerClass_by_classinstance一樣適用 11 //下面利用workClass_by_classname對象獲取類的一些屬性 12 //獲取類名 13 echo $workClass_by_classname->getName(); 14 //獲取類的方法列表 15 var_dump($workClass_by_classname->getMethods()); 16 //獲取類的屬性 17 var_dump($workClass_by_classname->getProperties()); 18 19 //利用反射獲得方法,並執行該方法 20 $worker = $workClass_by_classname->newInstance("小明",20,20); 21 $show_method = new ReflectionMethod('Worker','show'); 22 $show_method->invoke($worker); 23 24 //利用反射機制獲得屬性,並設置值 25 $property = $workClass_by_classname->getProperty('name_'); 26 $property->setAccessible(true); 27 var_dump($property->getValue($worker)); 28 29 $property->setValue($worker ,'小紅'); 30 var_dump($property->getValue($worker));
除了這些外,PHP反射還有其餘的功能,具體可參考PHP手冊的反射部分框架