国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > PHP > 正文

thinkphp核心源碼注釋|DB.class.php

2019-11-11 02:34:10
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
<?php// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]// +----------------------------------------------------------------------// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.// +----------------------------------------------------------------------// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: liu21st <liu21st@Gmail.com>// +----------------------------------------------------------------------namespace Think;/** * ThinkPHP 數(shù)據(jù)庫(kù)中間層實(shí)現(xiàn)類(lèi) * 從類(lèi)的規(guī)則上看,看來(lái)是個(gè)基礎(chǔ)類(lèi)。 * 很經(jīng)典的,實(shí)現(xiàn)的主從,多數(shù)據(jù)庫(kù)連接的。 */class Db { static PRivate $instance = array(); // 數(shù)據(jù)庫(kù)連接實(shí)例 倉(cāng)庫(kù) static private $_instance = null; // 當(dāng)前數(shù)據(jù)庫(kù)連接實(shí)例 單獨(dú)返回 /** * 取得數(shù)據(jù)庫(kù)類(lèi)實(shí)例 * @static * @access public * @param mixed $config 連接配置 * @return Object 返回?cái)?shù)據(jù)庫(kù)驅(qū)動(dòng)類(lèi) */ static public function getInstance($config=array()) { $md5 = md5(serialize($config)); // 跟那個(gè) to_guid_string 有點(diǎn)相似啊 if(!isset(self::$instance[$md5])) { // 解析連接參數(shù) 支持?jǐn)?shù)組和字符串 $options = self::parseConfig($config);// 解析的抽離,漂亮! // 兼容MySQLi if('mysqli' == $options['type']) $options['type'] = 'mysql';// 大哥,你這個(gè)是欺騙??! // 嗯,的確是個(gè)欺騙, 內(nèi)核函數(shù)用的都是 PDO 哎,我還以為默認(rèn)的配置是 myslqi 呢 // 如果采用lite方式 僅支持原生SQL 包括query和execute方法 $class = !empty($options['lite'])? 'Think/Db/Lite' : 'Think//Db//Driver//'.ucWords(strtolower($options['type'])); if(class_exists($class)){// 類(lèi)存在判讀 self::$instance[$md5] = new $class($options); }else{ // 類(lèi)沒(méi)有定義 E(L('_NO_DB_DRIVER_').': ' . $class); } } self::$_instance = self::$instance[$md5]; return self::$_instance; } /** * 數(shù)據(jù)庫(kù)連接參數(shù)解析 * @static * @access private * @param mixed $config * @return array */ static private function parseConfig($config){ if(!empty($config)){ // 這里就體現(xiàn)了參數(shù)解析的優(yōu)先級(jí),臨時(shí)配置的先解析,否則去尋找默認(rèn)配置 if(is_string($config)) { return self::parseDsn($config); } $config = array_change_key_case($config); // 默認(rèn)小寫(xiě) array_change_key_case() 函數(shù)將數(shù)組的所有的鍵都轉(zhuǎn)換為大寫(xiě)字母或小寫(xiě)字母。 $config = array ( 'type' => $config['db_type'],// 數(shù)據(jù)庫(kù)類(lèi)型 常用mysqli 其實(shí)開(kāi)的是pdo 'username' => $config['db_user'],// 登錄數(shù)據(jù)庫(kù)的用戶(hù)名 'password' => $config['db_pwd'],// 密碼 'hostname' => $config['db_host'],// 主機(jī)位置 'hostport' => $config['db_port'],// 端口號(hào),默認(rèn) 3306 'database' => $config['db_name'],// 數(shù)據(jù)庫(kù)名稱(chēng) 'dsn' => isset($config['db_dsn'])?$config['db_dsn']:null,// 明確是否使用dsn配置方式 'params' => isset($config['db_params'])?$config['db_params']:null,// 數(shù)據(jù)庫(kù)解析 'charset' => isset($config['db_charset'])?$config['db_charset']:'utf8',// 默認(rèn)字符集設(shè)置 'deploy' => isset($config['db_deploy_type'])?$config['db_deploy_type']:0,// 是否分布式支持 'rw_separate' => isset($config['db_rw_separate'])?$config['db_rw_separate']:false,// 配置是否讀寫(xiě)分類(lèi) 'master_num' => isset($config['db_master_num'])?$config['db_master_num']:1,// 主要數(shù)據(jù)庫(kù) 數(shù)量 'slave_no' => isset($config['db_slave_no'])?$config['db_slave_no']:'',// 從庫(kù)數(shù)量 'debug' => isset($config['db_debug'])?$config['db_debug']:APP_DEBUG,// 是否開(kāi)啟調(diào)試 'lite' => isset($config['db_lite'])?$config['db_lite']:false,//另外的一種數(shù)據(jù)庫(kù)形式,暫時(shí)沒(méi)有做研究中......... ); }else { // 尋找默認(rèn)配置中 解釋同上 $config = array ( 'type' => C('DB_TYPE'), 'username' => C('DB_USER'), 'password' => C('DB_PWD'), 'hostname' => C('DB_HOST'), 'hostport' => C('DB_PORT'), 'database' => C('DB_NAME'), 'dsn' => C('DB_DSN'), 'params' => C('DB_PARAMS'), 'charset' => C('DB_CHARSET'), 'deploy' => C('DB_DEPLOY_TYPE'), 'rw_separate' => C('DB_RW_SEPARATE'), 'master_num' => C('DB_MASTER_NUM'), 'slave_no' => C('DB_SLAVE_NO'), 'debug' => C('DB_DEBUG',null,APP_DEBUG), 'lite' => C('DB_LITE'), ); } return $config; } /** * DSN解析 * 格式: mysql://username:passwd@localhost:3306/DbName?param1=val1?m2=val2#utf8 * @static * @access private * @param string $dsnStr * @return array */ static private function parseDsn($dsnStr) { if( empty($dsnStr) ){return false;} $info = parse_url($dsnStr);// 通過(guò)url的格式解析器,進(jìn)行解析的,牛叉,好友創(chuàng)意 if(!$info) { return false; } $dsn = array( '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' => isset($info['path']) ? substr($info['path'],1) : '', 'charset' => isset($info['fragment'])?$info['fragment']:'utf8', ); if(isset($info['query'])) { parse_str($info['query'],$dsn['params']);// 可以解析其 字符串 }else{ $dsn['params'] = array(); } return $dsn; } // 總結(jié),挺簡(jiǎn)單的,兩個(gè)系統(tǒng)函數(shù)就搞定了,格式的轉(zhuǎn)換 // 調(diào)用驅(qū)動(dòng)類(lèi)的方法 這個(gè)也是個(gè)申請(qǐng)的函數(shù),不錯(cuò)! static public function __callStatic($method, $params){ return call_user_func_array(array(self::$_instance, $method), $params); }}// 總結(jié),其實(shí),這個(gè)類(lèi),也沒(méi)干什么// 第一針對(duì)于 mysql 統(tǒng)一傳到 msyql.php 驅(qū)動(dòng)中,內(nèi)核驅(qū)動(dòng)用的pdo// 第二:解析了配置參數(shù),體現(xiàn)了傳入?yún)?shù)的優(yōu)先級(jí)// 第三:做了一個(gè)格式的轉(zhuǎn)換而已// 第四:通過(guò) 魔術(shù)方法實(shí)現(xiàn)了動(dòng)態(tài)調(diào)用。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 洪洞县| 安化县| 三都| 青神县| 临洮县| 沙坪坝区| 襄垣县| 福建省| 桂东县| 辽中县| 子长县| 封丘县| 绩溪县| 正安县| 新泰市| 丰镇市| 南郑县| 芷江| 峡江县| 兴仁县| 九龙县| 泰安市| 阳新县| 察雅县| 平安县| 循化| 洪湖市| 临泉县| 化隆| 肇庆市| 永济市| 佛冈县| 葵青区| 灵川县| 固阳县| 青神县| 丽江市| 香格里拉县| 安徽省| 罗定市| 崇义县|