什么是 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 属性。读取属性的基本模式
Laravel 读取 Queue 属性的机制(简化)
读取方法上的属性
包开发中的应用示例
检查类实现的接口
在包中可以动态确认某个类是否实现了特定接口。元数据获取 — 通过属性自动注册路由
结合属性与 Reflection 自动收集路由的模式。动态方法调用 — 方法注入
Laravel 的call() 方法利用 Reflection 自动解析参数。以下是在包中实现相同机制的示例。
收集属性的默认值
通过 Reflection 获取配置类的默认值的模式。性能方面的注意
Reflection API 每次都会解析类信息,成本较高。生产代码中缓存结果是最佳实践。下一步
PHP 属性
学习通过 ReflectionClass::getAttributes() 读取 PHP 属性的详情。
包开发
了解利用 Reflection API 的 Laravel 包开发方法。