PHP中的反射API就像Java中的java.lang.reflect包一样。它由一系列可以分析属性、方法和类的内置类组成。它在某些方面和对象函数相似,比如get_class_vars(),但是更加灵活,而且可以提供更多信息。反射API也可与PHP最新的面向对象特性一起工作,如访问控制、接口和抽象类。旧的类函数则不太容易与这些新特性一起使用。看过框架源码的朋友应该对PHP的反射机制有一定的了解,像是依赖注入,对象池,类加载,一些设计模式等等,都用到了反射机制。
反射API的部分类
使用反射API这些类,可以获得在运行时访问对象、函数和脚本中的扩展的信息。通过这些信息可以用来分析类或者构建框架。
| 类 | 描 述 |
| Reflection | 为类的摘要信息提供静态函数export() |
| ReflectionClass | 类信息和工具 |
| ReflectionMethod | 类方法信息和工具 |
| ReflectionParameter | 方法参数信息 |
| ReflectionProperty | 类属性信息 |
| ReflectionFunction | 函数信息和工具 |
| ReflectionExtension | PHP扩展信息 |
| ReflectionException | 错误类 |
获取类的信息
我们在工作中使用过一些用于检查类属性的函数,例如:get_class_methods、getProduct等。这些方法对获取详细类信息有很大的局限性。
我们可以通过反射API类:Reflection 和 ReflectionClass 提供的静态方法 export 来获取类的相关信息, export 可以提供类的几乎所有的信息,包括属性和方法的访问控制状态、每个方法需要的参数以及每个方法在脚本文档中的位置。这两个工具类, export 静态方法输出结果是一致的,只是使用方式不同。
首先,构建一个简单的类
<?php
class Student {
public $name;
protected $age;
private $sex;
public function __construct($name, $age, $sex)
{
$this->setName($name);
$this->setAge($age);
$this->setSex($sex);
}
public function setName($name)
{
$this->name = $name;
}
protected function setAge($age)
{
$this->age = $age;
}
private function setSex($sex)
{
$this->sex = $sex;
}
}
使用 ReflectionClass::export() 获取类信息
ReflectionClass::export('Student');
打印结果:

最低0.47元/天 解锁文章
177

被折叠的 条评论
为什么被折叠?



