31
05月
2020
/thinkphp/library/think/Config.php
...... /** * 解析配置文件或内容 * @access public * @param string $config 配置文件路径或内容 * @param string $type 配置解析类型 * @param string $name 配置名(如设置即表示二级配置) * @return mixed */ public function parse($config, $type = '', $name = '') { if (empty($type)) { $type = pathinfo($config, PATHINFO_EXTENSION); } /* * 默认支持 ini、json、xml 后缀的配置文件 * 如果以后多了其他后缀的配置文件, * 只需在 \\think\\config\\driver\\ 新增一个类(类名对应配置文件后缀名),并且实现parse() 解析规则方法 */ $object = Loader::factory($type, '\\think\\config\\driver\\', $config); // 获取到对象实例,调用 parse 方法 return $this->set($object->parse(), $name); } ......
/thinkphp/library/think/Loader.php
...... /** * 创建工厂对象实例 * @access public * @param string $name 工厂类名 * @param string $namespace 默认命名空间 * @return mixed */ public static function factory($name, $namespace = '', ...$args) { $class = false !== strpos($name, '\\') ? $name : $namespace . ucwords($name); if (class_exists($class)) { // 判断工厂类是否存在,获取工厂类的实例 return Container::getInstance()->invokeClass($class, $args); } else { throw new ClassNotFoundException('class not exists:' . $class, $class); } } ......
/thinkphp/library/think/Container.php
...... /** * 调用反射执行类的实例化 支持依赖注入 * @access public * @param string $class 类名 * @param array $vars 参数 * @return mixed */ public function invokeClass($class, $vars = []) { try { //ReflectionClass 类报告了一个类的有关信息。 $reflect = new ReflectionClass($class); if ($reflect->hasMethod('__make')) { $method = new ReflectionMethod($class, '__make'); if ($method->isPublic() && $method->isStatic()) { $args = $this->bindParams($method, $vars); return $method->invokeArgs(null, $args); } } // 获取类的构造函数 $constructor = $reflect->getConstructor(); $args = $constructor ? $this->bindParams($constructor, $vars) : []; // 创建一个类的新实例,给出的参数将传递到类的构造函数。 // 这个参数以 array 形式传递到类的构造函数 return $reflect->newInstanceArgs($args); } catch (ReflectionException $e) { throw new ClassNotFoundException('class not exists: ' . $class, $class); } } ......