PHP反射机制核心应用场景
PHP反射机制核心应用场景反射可以在运行时获取类、方法、属性的信息。框架的容器、路由、文档生成都依赖于反射。今天说说反射的各种用法。ReflectionClass可以获取类的信息。phpclass User{private int $id;public string $name;protected string $email;public function __construct(string $name, string $email) {}public function getName(): string { return $this-name; }public static function create(array $data): self { return new self($data[name], $data[email]); }}$ref new ReflectionClass(User::class);echo 类名: . $ref-getName() . \n;echo 可实例化: . ($ref-isInstantiable() ? 是 : 否) . \n;foreach ($ref-getProperties() as $prop) {echo . implode( , Reflection::getModifierNames($prop-getModifiers())) . \${$prop-getName()}\n;}foreach ($ref-getMethods() as $method) {echo . implode( , Reflection::getModifierNames($method-getModifiers())) . {$method-getName()}()\n;}?反射用于自动依赖解析。phpclass Container{public function make(string $class): object{$ref new ReflectionClass($class);$ctor $ref-getConstructor();if ($ctor null) return $ref-newInstance();$params [];foreach ($ctor-getParameters() as $param) {$type $param-getType();if ($type instanceof ReflectionNamedType !$type-isBuiltin()) {$params[] $this-make($type-getName());} elseif ($param-isDefaultValueAvailable()) {$params[] $param-getDefaultValue();}}return $ref-newInstanceArgs($params);}}class Logger{public function log(string $msg): void { echo 日志: $msg\n; }}class UserService{public function __construct(private Logger $logger) {}public function register(): void { $this-logger-log(用户注册); }}$container new Container();$service $container-make(UserService::class);$service-register();?反射在属性访问控制上的应用。phpfunction objectToArray(object $obj): array{$ref new ReflectionClass($obj);$result [];foreach ($ref-getProperties() as $prop) {$prop-setAccessible(true);$result[$prop-getName()] $prop-getValue($obj);}return $result;}$user new User(张三, testtest.com);print_r(objectToArray($user));?反射调用方法的另一种方式。phpfunction callMethod(object $obj, string $method, array $args []): mixed{$ref new ReflectionMethod($obj, $method);$params [];foreach ($ref-getParameters() as $param) {$name $param-getName();if (isset($args[$name])) $params[] $args[$name];elseif ($param-isDefaultValueAvailable()) $params[] $param-getDefaultValue();}return $ref-invokeArgs($obj, $params);}?反射是框架的核心技术。容器自动解析依赖、路由映射控制器方法、ORM映射数据库记录背后都是反射在起作用。理解反射的用法对理解框架原理很有帮助。