ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] * * * * * # 1 数据库连接 >>数据库类(Db)主要用来根据数据库配置(database)建立数据库的连接 ## Db::connect() >>数据库连接入口 >创建对配置唯一的连接对象 ~~~ public static function connect($config = [], $name = false) { if (false === $name) { $name = md5(serialize($config)); } if (true === $name || !isset(self::$instance[$name])) { // 解析连接参数 支持数组和字符串 $options = self::parseConfig($config); if (empty($options['type'])) { throw new \InvalidArgumentException('Underfined db type'); } $class = false !== strpos($options['type'], '\\') ? $options['type'] : '\\think\\db\\connector\\' . ucwords($options['type']); // 记录初始化信息 if (App::$debug) { Log::record('[ DB ] INIT ' . $options['type'], 'info'); } if (true === $name) { return new $class($options); } else { self::$instance[$name] = new $class($options); } } return self::$instance[$name]; } ~~~ ## Db::parseConfig() >> 数据库数组配置解析 > 获取配置中的数据库配置字段 ~~~ private static function parseConfig($config) { if (empty($config)) { $config = Config::get('database'); } elseif (is_string($config) && false === strpos($config, '/')) { // 支持读取配置参数 $config = Config::get($config); } if (is_string($config)) { return self::parseDsn($config); } else { return $config; } } ~~~ ## Db::parseDsn() >> 数据库字符串配置解析 >解析DSN格式数据库配置 ~~~ private static function parseDsn($dsnStr) { $info = parse_url($dsnStr); if (!$info) { return []; } $dsn = [ 'type' => $info['scheme'], 'username' => isset($info['user']) ? $info['user'] : '', 'password' => isset($info['pass']) ? $info['pass'] : '', 'hostname' => isset($info['host']) ? $info['host'] : '', 'hostport' => isset($info['port']) ? $info['port'] : '', 'database' => !empty($info['path']) ? ltrim($info['path'], '/') : '', 'charset' => isset($info['fragment']) ? $info['fragment'] : 'utf8', ]; if (isset($info['query'])) { parse_str($info['query'], $dsn['params']); } else { $dsn['params'] = []; } return $dsn; } ~~~ # 2 数据库接口 ## Db::__callStatic() >>对于不存在Db类的静态方法的调用则调用连接对象的方法 >连接对象的相关操作见 [数据库连接](http://www.kancloud.cn/zmwtp/tp/212778) 章节 ~~~ public static function __callStatic($method, $params) { // 自动初始化数据库 return call_user_func_array([self::connect(), $method], $params); } ~~~