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');
打印结果: