首页 > 编程笔记 > PHP笔记 阅读:7

PHP反射机制用法详解(附带实例)

反射主要用于框架或插件的开发,在平常的开发中并不常见。在 PHP 中,反射用于实现对象的调试、类信息的获取等。

反射是 PHP 针对面向对象编程提供的一种“自省”的过程。可以将其理解为根据“目的地”寻找“出发地或来源”。例如,对某个对象进行反射,找到这个对象所属的类、拥有的方法和属性、方法的参数、文档注释等详细信息。

在 PHP 中使用反射,主要通过反射 API 来完成。反射 API 常用的类与接口如下表所示。

表:反射 API 常用的类与接口
类/接口 说明
Reflection 反射类
Reflector 反射接口
ReflectionClass 获取类的相关信息
ReflectionObject 获取对象的相关信息
ReflectionMethod 获取方法的相关信息
ReflectionProperty 获取类的属性的相关信息
ReflectionParameter 获取函数或方法参数的相关信息
ReflectionExtension 获取扩展的相关信息
ReflectionFunction 获取函数的相关信息
ReflectionFunctionAbstract ReflectionFunction 的父类
ReflectionException 用于反射异常处理
ReflectionClassConstant 获取类常量的信息
ReflectionType 获取参数或者返回值的类型

在表中,Reflector 是反射接口,其余的都是反射类。

反射 API 常用的方法如下表所示:

表:反射 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>';
在上述代码中:
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/"


反射机制使得程序能够在运行时自省和自我分析,程序可以检查和了解自身的结构和行为,帮助开发人员对代码进行审查和优化。在生活中,我们也要时刻自省,及时发现并纠正错误。

相关文章