php实现反射
PHP 反射机制基础
PHP 反射(Reflection)是一种强大的内置功能,允许在运行时获取类、方法、属性等结构信息,并动态调用或修改它们。反射 API 提供了一系列类来实现这些操作。
反射类常用操作
获取类信息
$reflectionClass = new ReflectionClass('ClassName');
echo $reflectionClass->getName(); // 获取类名
var_dump($reflectionClass->getMethods()); // 获取所有方法
检查类属性

$reflectionClass = new ReflectionClass('ClassName');
$properties = $reflectionClass->getProperties();
foreach ($properties as $property) {
echo $property->getName() . "\n";
}
动态调用方法
$reflectionMethod = new ReflectionMethod('ClassName', 'methodName');
$instance = new ClassName();
$reflectionMethod->invoke($instance, $arg1, $arg2); // 调用方法
反射在依赖注入中的应用
反射可用于实现简单的依赖注入容器:

class Container {
public function resolve($className) {
$reflectionClass = new ReflectionClass($className);
$constructor = $reflectionClass->getConstructor();
if (!$constructor) {
return new $className;
}
$parameters = $constructor->getParameters();
$dependencies = [];
foreach ($parameters as $parameter) {
$dependency = $this->resolve($parameter->getClass()->getName());
$dependencies[] = $dependency;
}
return $reflectionClass->newInstanceArgs($dependencies);
}
}
反射性能注意事项
反射操作比直接调用慢,应避免在性能关键路径过度使用。可通过缓存反射结果来优化:
$cache = [];
$className = 'SomeClass';
if (!isset($cache[$className])) {
$cache[$className] = new ReflectionClass($className);
}
反射与私有成员访问
反射可以绕过访问控制,但应谨慎使用:
$reflectionProperty = new ReflectionProperty('ClassName', 'privateProperty');
$reflectionProperty->setAccessible(true);
$value = $reflectionProperty->getValue($instance);
常用反射类列表
ReflectionClass- 类信息ReflectionMethod- 方法信息ReflectionProperty- 属性信息ReflectionParameter- 参数信息ReflectionFunction- 函数信息ReflectionObject- 对象信息
反射机制为PHP提供了强大的元编程能力,合理使用可以构建灵活的框架和工具,但需注意其性能影响和潜在的安全风险。






