php反射实现
PHP 反射的基本概念
PHP 反射(Reflection)是一种强大的内置功能,允许在运行时获取类、方法、属性等结构信息,并动态调用或修改它们。反射 API 提供了一组类(如 ReflectionClass、ReflectionMethod 等),用于分析代码结构。
反射的核心类
- ReflectionClass: 获取类的信息(如方法、属性、命名空间等)。
- ReflectionMethod: 分析类的方法(如参数、访问修饰符等)。
- ReflectionProperty: 访问类的属性。
- ReflectionFunction: 分析函数或闭包。
- ReflectionParameter: 获取方法或函数的参数信息。
使用 ReflectionClass 获取类信息
通过 ReflectionClass 可以获取类的详细信息:

class Example {
public $property;
public function method() {}
}
$reflection = new ReflectionClass('Example');
echo $reflection->getName(); // 输出类名 "Example"
检查类的方法和属性:

$methods = $reflection->getMethods();
foreach ($methods as $method) {
echo $method->getName(); // 输出方法名 "method"
}
$properties = $reflection->getProperties();
foreach ($properties as $property) {
echo $property->getName(); // 输出属性名 "property"
}
动态调用方法
通过 ReflectionMethod 可以动态调用方法:
$method = new ReflectionMethod('Example', 'method');
$instance = new Example();
$method->invoke($instance); // 调用 Example->method()
修改私有属性
反射可以绕过访问限制修改私有属性:
class Secret {
private $value = 'hidden';
}
$reflection = new ReflectionClass('Secret');
$property = $reflection->getProperty('value');
$property->setAccessible(true); // 允许访问私有属性
$instance = new Secret();
$property->setValue($instance, 'exposed');
echo $property->getValue($instance); // 输出 "exposed"
反射的应用场景
- 依赖注入容器: 动态解析类的构造函数参数。
- 单元测试: 测试私有方法或属性。
- 框架开发: 实现注解或自动路由功能。
- 代码分析工具: 检查代码结构或生成文档。
性能注意事项
反射操作比直接调用稍慢,适合开发工具或框架,但在高频业务逻辑中应谨慎使用。缓存反射结果(如通过 ReflectionClass 实例)可以优化性能。






