反射机制简介
- 之前已经介绍过Java反射机制的简单使用,所有的反射机制的思想作用等都是类似的,下面就一起来了解一下PHP反射机制。
- 个人理解:反射机制就是可以利用类名或者一个类的对象来获取关于这个类的一系列信息(类的变量,方法),然后又就可以利用得到的类的信息实例化一些类的对象
- 官方给的简介:反射 API,有 对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。
- 一般在框架中使用到反射机制比较多(控制反转),正常情况下一般使用不到反射的
反射机制的使用
- 常用的类
- ReflectionClass 通过类名获取类的信息
- ReflectionObject 通过类的对象获取类的信息
-
代码,还以之前介绍Java反射的Worker类为例
worker.php:
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 在一个文件夹下1 <?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手册的反射部分