去评论
dz插件网

php反射完整运用例子

哥斯拉
2023/05/19 10:19:57
  1. <?php// 数据库类class Database {    private $username;    private $password;        public function __construct($username, $password) {        $this->username = $username;        $this->password = $password;    }        public function connect() {        // 连接数据库    }}// 用户类,需要依赖于数据库类class User {    private $database;        // 构造函数,需要传入一个数据库实例    public function __construct(Database $database) {        $this->database = $database;    }        // 执行查询,需要使用数据库实例    public function read() {        $this->database->connect();        // 执行查询    }}// 反射依赖注入类class ReflectionInjector {    // 依赖注入方法,需要传入一个类名和一个参数包    public function inject($class, $arguments = []) {        // 反射类        $reflector = new ReflectionClass($class);        // 获取构造函数        $constructor = $reflector->getConstructor();        // 获取构造函数参数        $parameters = $constructor->getParameters();        // 构造参数数组        $dependencies = [];        foreach ($parameters as $parameter) {            // 获取参数类型            $dependency = $parameter->getType()->getName();            // 如果参数是一个类,执行依赖注入记过            if (class_exists($dependency)) {                $dependencies[$parameter->getPosition()] = $this->inject($dependency);            } else if (array_key_exists($parameter->getPosition(), $arguments)) {                $dependencies[$parameter->getPosition()] = $arguments[$parameter->getPosition()];            } else if ($parameter->isDefaultValueAvailable()) {                $dependencies[$parameter->getPosition()] = $parameter->getDefaultValue();            } else {                throw new Exception('Cannot resolve dependency: ' . $dependency);            }        }        // 利用反射机制实例化一个新的对象        return $reflector->newInstanceArgs($dependencies);    }}// 实例化反射依赖注入类$injector = new ReflectionInjector();// 通过反射依赖注入实例化用户对象$user = $injector->inject('User', [new Database('username', 'password')]);// 执行用户读操作$user->read();