php实现反射
PHP 反射的基本概念
反射(Reflection)是 PHP 提供的一种强大功能,允许在运行时检查类、接口、方法、属性等结构信息。通过反射 API,可以动态获取和操作代码的元数据,实现诸如依赖注入、动态调用、代码分析等功能。
反射类的使用
反射的核心类是 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() . "\n";
}
$properties = $reflection->getProperties();
foreach ($properties as $property) {
echo $property->getName() . "\n";
}
动态调用方法
反射可以动态调用类的方法,即使方法是私有的:
$example = new Example();
$method = $reflection->getMethod('method');
$method->invoke($example); // 调用 method()
修改属性值
反射可以动态修改类的属性值,包括私有属性:

$property = $reflection->getProperty('property');
$property->setAccessible(true); // 允许访问私有属性
$property->setValue($example, 'new value');
echo $property->getValue($example); // 输出 "new value"
反射的其他用途
反射还可以用于获取命名空间、父类、接口、构造函数等信息:
echo $reflection->getNamespaceName();
echo $reflection->getParentClass();
echo $reflection->getInterfaces();
反射与依赖注入
反射常用于实现依赖注入容器,动态解析类的依赖:
function make($class) {
$reflection = new ReflectionClass($class);
$constructor = $reflection->getConstructor();
if (!$constructor) {
return new $class;
}
$parameters = $constructor->getParameters();
$dependencies = [];
foreach ($parameters as $parameter) {
$dependencies[] = make($parameter->getClass()->getName());
}
return $reflection->newInstanceArgs($dependencies);
}
注意事项
反射功能强大,但过度使用可能导致性能下降或代码可读性降低。建议仅在需要动态分析或操作代码结构时使用。






