PHP 反射类 实现
PHP 反射类的基本概念
反射(Reflection)是PHP提供的一组内置类,用于在运行时获取类、方法、属性等结构信息,并支持动态调用或修改。反射类的核心用途包括分析类结构、动态调用方法、检查注解等。
反射类的常用类
PHP反射功能主要通过以下类实现:

- ReflectionClass:分析类的结构(如方法、属性、命名空间等)。
- ReflectionMethod:获取和操作类的方法信息。
- ReflectionProperty:访问和修改类的属性。
- ReflectionFunction:分析函数信息(包括闭包)。
- ReflectionParameter:获取函数或方法的参数信息。
反射类的典型用法
分析类结构
通过ReflectionClass获取类的基本信息:
class Example {
public $property;
public function method() {}
}
$reflection = new ReflectionClass('Example');
echo $reflection->getName(); // 输出类名 "Example"
echo $reflection->hasMethod('method'); // 检查方法是否存在,返回 true
动态调用方法
使用ReflectionMethod调用私有或受保护方法:

$obj = new Example();
$method = new ReflectionMethod('Example', 'method');
$method->setAccessible(true); // 允许调用非公有方法
$method->invoke($obj); // 执行方法
修改属性值
通过ReflectionProperty动态修改属性:
$property = new ReflectionProperty('Example', 'property');
$property->setAccessible(true);
$property->setValue($obj, 'new value'); // 修改属性值
echo $property->getValue($obj); // 输出 "new value"
获取函数参数信息
使用ReflectionParameter分析参数:
function demo($param1, int $param2 = 0) {}
$refFunc = new ReflectionFunction('demo');
foreach ($refFunc->getParameters() as $param) {
echo $param->getName() . ' (默认值: ' . ($param->isDefaultValueAvailable() ? $param->getDefaultValue() : '无') . ')';
}
实际应用场景
- 依赖注入容器:通过反射分析构造函数参数,实现自动依赖注入。
- 单元测试:访问私有方法或属性进行测试。
- 动态代理:拦截方法调用并添加额外逻辑(如日志记录)。
- 注解解析:结合
ReflectionClass和getDocComment()解析注释中的元数据。
注意事项
- 反射操作可能影响性能,避免在高频代码中使用。
- 修改私有属性或方法可能破坏封装性,需谨慎使用。
- PHP 8+ 提供了更丰富的反射API(如
ReflectionAttribute处理注解)。






