php反射实现
PHP 反射机制的基本概念
PHP 反射(Reflection)是一种强大的内置功能,允许在运行时检查类、方法、属性等结构,并动态调用或修改它们。反射 API 提供了 ReflectionClass、ReflectionMethod、ReflectionProperty 等类,用于分析和操作代码结构。
反射类的使用
通过 ReflectionClass 可以获取类的详细信息,例如类名、方法、属性、命名空间等。
class Example {
public $property;
public function method() {}
}
$reflection = new ReflectionClass('Example');
echo $reflection->getName(); // 输出类名 "Example"
反射方法的动态调用
使用 ReflectionMethod 可以动态调用类的方法,即使方法是私有的或受保护的。
$method = new ReflectionMethod('Example', 'method');
if ($method->isPublic()) {
$example = new Example();
$method->invoke($example); // 调用方法
}
反射属性的访问与修改
ReflectionProperty 允许动态访问或修改类的属性,包括私有属性。
$property = new ReflectionProperty('Example', 'property');
$example = new Example();
$property->setValue($example, 'new value'); // 修改属性值
echo $property->getValue($example); // 获取属性值
反射在依赖注入中的应用
反射常用于实现依赖注入(DI),动态解析类的构造函数参数并自动注入依赖。
function make($class) {
$reflection = new ReflectionClass($class);
$constructor = $reflection->getConstructor();
if (!$constructor) {
return new $class();
}
$parameters = $constructor->getParameters();
$dependencies = array_map(function ($param) {
return make($param->getClass()->getName());
}, $parameters);
return $reflection->newInstanceArgs($dependencies);
}
$instance = make('Example');
反射的注意事项
- 性能开销:反射操作比直接调用慢,频繁使用可能影响性能。
- 安全性:反射可以绕过访问控制(如调用私有方法),需谨慎使用。
- 调试工具:反射适合框架开发、测试工具等场景,而非普通业务逻辑。
反射与匿名函数
PHP 7+ 支持通过 ReflectionFunction 检查匿名函数(闭包)的参数和返回值。
$func = function ($arg) { return $arg; };
$reflection = new ReflectionFunction($func);
var_dump($reflection->getParameters());






