跳转到主要内容

什么是 PHP Reflection API

PHP Reflection API 是 PHP 内置的能力,可以在运行时获取并检查类、方法、属性、函数、参数等的元信息。可以在不改动源码的情况下探知一个类的构造函数接受哪些参数、方法上挂了哪些属性等等。 Laravel 在 Illuminate/Container/Container.php 中大量使用了 Reflection API,实现了 DI 容器的自动解析、PHP 属性的读取、方法注入等能力。

主要类

ReflectionClass — 获取类信息

ReflectionParameter — 检查构造函数参数

Laravel 容器与 Reflection API

Laravel 的 IoC 容器利用 Reflection API 实现构造函数注入(依赖自动解析)。理解一下 app()->make(SomeClass::class) 与依赖注入的工作原理。

容器的 build() 方法(简化版)

Container.php 中真正的 build() 方法大致是这样的:
Util::getParameterClassName() 是从 $parameter->getType() 提取类型名字符串的工具。它将 ReflectionParameter::getType() 返回的 ReflectionNamedType 做了便捷封装。

读取 PHP 属性

PHP 8.0 及以后,可以通过 Reflection API 读取类、方法、属性上挂的 PHP 属性。Laravel 利用该机制来处理队列属性与 Eloquent 属性。
关于 PHP 属性及其在 Laravel 中的集成,请一并参考 PHP 属性

读取属性的基本模式

Laravel 读取 Queue 属性的机制(简化)

读取方法上的属性

包开发中的应用示例

检查类实现的接口

在包中可以动态确认某个类是否实现了特定接口。

元数据获取 — 通过属性自动注册路由

结合属性与 Reflection 自动收集路由的模式。

动态方法调用 — 方法注入

Laravel 的 call() 方法利用 Reflection 自动解析参数。以下是在包中实现相同机制的示例。

收集属性的默认值

通过 Reflection 获取配置类的默认值的模式。

性能方面的注意

Reflection API 每次都会解析类信息,成本较高。生产代码中缓存结果是最佳实践。
PHP 的 OPcache 不会缓存 Reflection 结果。若在循环中检查大量类,请考虑自定义缓存。不过 Laravel 容器本身在同一请求内会复用 ReflectionClass 实例。

下一步

PHP 属性

学习通过 ReflectionClass::getAttributes() 读取 PHP 属性的详情。

包开发

了解利用 Reflection API 的 Laravel 包开发方法。
最后修改于 2026年7月18日