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/"
反射机制使得程序能够在运行时自省和自我分析,程序可以检查和了解自身的结构和行为,帮助开发人员对代码进行审查和优化。在生活中,我们也要时刻自省,及时发现并纠正错误。
ICP备案:
公安联网备案: