- 以前已经介绍过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手册的反射部分框架