PHP反射机制用法详解(附带实例)
反射主要用于框架或插件的开发,在平常的开发中并不常见。在 PHP 中,反射用于实现对象的调试、类信息的获取等。
反射是 PHP 针对面向对象编程提供的一种“自省”的过程。可以将其理解为根据“目的地”寻找“出发地或来源”。例如,对某个对象进行反射,找到这个对象所属的类、拥有的方法和属性、方法的参数、文档注释等详细信息。
在 PHP 中使用反射,主要通过反射 API 来完成。反射 API 常用的类与接口如下表所示。
在表中,Reflector 是反射接口,其余的都是反射类。
反射 API 常用的方法如下表所示:
为了让读者更好地理解,下面演示如何使用反射获取类属性的信息,具体步骤如下:
① 在 VS Code 编辑器中打开 C:\web\apache2.4\htdocs 目录,创建 Upload.php 文件,用于后续通过反射来获取其基本信息,具体代码如下:
② 创建 reflect.php 文件,引入 Upload.php,获取 Upload 类的所有属性,输出其中的公有属性,具体代码如下:
reflect.php 文件的运行结果为:
反射机制使得程序能够在运行时自省和自我分析,程序可以检查和了解自身的结构和行为,帮助开发人员对代码进行审查和优化。在生活中,我们也要时刻自省,及时发现并纠正错误。
反射是 PHP 针对面向对象编程提供的一种“自省”的过程。可以将其理解为根据“目的地”寻找“出发地或来源”。例如,对某个对象进行反射,找到这个对象所属的类、拥有的方法和属性、方法的参数、文档注释等详细信息。
在 PHP 中使用反射,主要通过反射 API 来完成。反射 API 常用的类与接口如下表所示。
类/接口 | 说明 |
---|---|
Reflection | 反射类 |
Reflector | 反射接口 |
ReflectionClass | 获取类的相关信息 |
ReflectionObject | 获取对象的相关信息 |
ReflectionMethod | 获取方法的相关信息 |
ReflectionProperty | 获取类的属性的相关信息 |
ReflectionParameter | 获取函数或方法参数的相关信息 |
ReflectionExtension | 获取扩展的相关信息 |
ReflectionFunction | 获取函数的相关信息 |
ReflectionFunctionAbstract | ReflectionFunction 的父类 |
ReflectionException | 用于反射异常处理 |
ReflectionClassConstant | 获取类常量的信息 |
ReflectionType | 获取参数或者返回值的类型 |
在表中,Reflector 是反射接口,其余的都是反射类。
反射 API 常用的方法如下表所示:
类名 | 方法名 | 功能描述 |
---|---|---|
ReflectionClass | getMethod() | 获取一个类方法的 ReflectionMethod 对象 |
getName() | 获取类名 | |
getConstructor() | 获取类的构造函数 | |
ReflectionMethod | invoke() | 实现执行操作 |
invokeArgs() | 带参数执行 | |
isPublic() | 判断方法是否是公开方法 | |
getProperties() | 获取一组属性 | |
ReflectionFunctionAbstract | getNumberOfParameters() | 获取参数数目 |
getParameters | 获取参数 | |
ReflectionProperty | getDocComment() | 获取属性文档注释 |
getName() | 获取属性名称 | |
getValue() | 获取属性值 | |
isDefault() | 检查属性是否是默认属性 | |
isPrivate() | 检查属性是否是私有属性 | |
isProtected() | 检查属性是否是保护属性 | |
isPublic() | 检查属性是否是公有属性 | |
isStatic() | 检查属性是否是静态属性 | |
ReflectionParameter | getClass() | 获得类型提示类 |
getDefaultValue() | 获取默认属性值 | |
ReflectionExtension | getFunctions() | 获取扩展中的函数 |
getINIEntries() | 获取 ini 配置 | |
getVersion() | 获取扩展版本号 | |
info() | 输出扩展信息 |
为了让读者更好地理解,下面演示如何使用反射获取类属性的信息,具体步骤如下:
① 在 VS Code 编辑器中打开 C:\web\apache2.4\htdocs 目录,创建 Upload.php 文件,用于后续通过反射来获取其基本信息,具体代码如下:
<?php // 定义一个类,用于测试 class Upload { /** * 上传文件信息 */ private $file = []; /** * 上传文件保存目录 */ public $upload_dir = '/upload/'; }
② 创建 reflect.php 文件,引入 Upload.php,获取 Upload 类的所有属性,输出其中的公有属性,具体代码如下:
<?php require './upload.php'; // 获取类中所有的属性 $reflect = new ReflectionClass('Upload'); $properties = $reflect->getProperties(); echo '<pre>'; var_dump($properties); // 获取public属性的文档注释、属性名、属性值 foreach($properties as $property) { if ($property->isPublic()) { var_dump($property->getDocComment()); // 文档注释 var_dump($property->getName()); // 属性名称 var_dump($property->getValue(new Upload)); // 属性值 } } echo '</pre>';在上述代码中:
- 第 4 行代码获取 Upload 类的反射对象;
- 第 5 行代码通过反射对象调用 getProperties() 方法获取 Upload 类的所有属性;
- 第 9~15 行代码遍历所有属性,获取公有属性的文档注释、属性名和属性值。
reflect.php 文件的运行结果为:
array(2) {
[0]=>
object(ReflectionProperty)#2 (2) {
["name"]=>
string(4) "file"
["class"]=>
string(6) "Upload"
}
[1]=>
object(ReflectionProperty)#3 (2) {
["name"]=>
string(10) "upload_dir"
["class"]=>
string(6) "Upload"
}
}
string(43) "/**
* 上传文件保存目录
*/
string(10) "upload_dir"
string(8) "/upload/"
反射机制使得程序能够在运行时自省和自我分析,程序可以检查和了解自身的结构和行为,帮助开发人员对代码进行审查和优化。在生活中,我们也要时刻自省,及时发现并纠正错误。