php反射允许运行时动态获取类、方法、属性及注解等元信息,核心通过reflectionclass等实现;支持获取结构信息、筛选成员、解析docblock、安全调用与实例化,但需注意权限、序列化限制及性能开销。

PHP反射(Reflection)能让你在运行时动态获取类、方法、属性、注解等元信息,无需实例化对象就能探查结构。核心是通过 ReflectionClass 及其相关类完成。
获取类的基本结构信息
用 new ReflectionClass('ClassName') 创建反射对象后,可直接读取类名、是否为接口/抽象类、父类、实现的接口等:
-
$ref->getName()返回完整类名(含命名空间) -
$ref->isInterface()、$ref->isAbstract()、$ref->isFinal()判断类型特征 -
$ref->getParentClass()返回父类的ReflectionClass对象(或null) -
$ref->getInterfaces()返回以接口名为键、ReflectionClass为值的数组
动态读取属性和方法列表
反射支持按可见性筛选成员,返回对应 ReflectionProperty 或 ReflectionMethod 对象数组:
-
$ref->getProperties(ReflectionProperty::IS_PUBLIC)获取所有 public 属性(可组合IS_PROTECTED/IS_PRIVATE) -
$ref->getMethods(ReflectionMethod::IS_PUBLIC)同理获取方法,也支持IS_STATIC等标志位 - 每个
ReflectionProperty对象可调用getName()、isStatic()、isProtected()等方法判断细节 - 每个
ReflectionMethod可用getNumberOfParameters()、getReturnType()(PHP 7.1+)、hasReturnType()查看签名
获取注解(DocBlock)和参数信息
PHP 反射能解析 PHPDoc 注释,常用于框架路由、依赖注入等场景:
-
$ref->getDocComment()返回整个类的 DocBlock 字符串(含/** ... */) -
$method->getDocComment()获取某方法的注释内容 -
$method->getParameters()返回ReflectionParameter数组,每个可调用getName()、getType()、isOptional()、getDefaultValue()(需先isDefaultValueAvailable()判断) - 若需解析注解语义(如
@Route),需自行用正则或工具(如 phpdocumentor/reflection-docblock)提取
安全调用与实例化控制
反射不仅能“看”,还能“做”——但需注意权限和逻辑合理性:
-
$ref->newInstance()调用无参构造;$ref->newInstanceArgs([$a, $b])传参创建实例 -
$method->invoke($obj, ...$args)安全调用对象方法(自动处理 private/protected) -
$method->invokeArgs($obj, $args)传数组参数调用 - 对 private 属性,可用
$prop->setAccessible(true)后再$prop->getValue($obj)或$prop->setValue($obj, $val) - 注意:启用
setAccessible(true)在 PHP 8.1+ 中仅对内部反射有效,且部分 SAPI(如某些嵌入式环境)可能限制该行为
不复杂但容易忽略:反射对象本身不可序列化,且频繁使用会带来性能开销,建议缓存 ReflectionClass 实例或结合 opcode 缓存优化。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











