PHP基於單例模式實現編寫PDO類的方法

來源:互聯網
上載者:User
這篇文章的代碼是用此前一個名為MyPDO的類改寫的,引入了單例模式來保證在全域調用中不會重複執行個體化這個類,降低系統資源的浪費。有需要的朋友們可以參考借鑒,下面來一起看看吧。

一、單例模式簡介

簡單的說,一個對象(在學習設計模式之前,需要比較瞭解物件導向思想)只負責一個特定的任務;

二、為什麼要使用PHP單例模式?

1、php的應用主要在於資料庫應用, 所以一個應用中會存在大量的資料庫操作, 使用單例模式, 則可以避免大量的new 操作消耗的資源。

2、如果系統中需要有一個類來全域控制某些配置資訊, 那麼使用單例模式可以很方便的實現. 這個可以參看ZF的FrontController部分。

3、在一次頁面請求中, 便於進行調試, 因為所有的代碼(例如資料庫操作類db)都集中在一個類中, 我們可以在類中設定鉤子, 輸出日誌,從而避免到處var_dump, echo

三、PHP基於單例模式編寫PDO類的範例程式碼

代碼如下:

<?php/** * MyPDO * @author Jason.Wei <jasonwei06@hotmail.com> * @license http://www.sunbloger.com/ * @version 5.0 utf8 */class MyPDO{ protected static $_instance = null; protected $dbName = ''; protected $dsn; protected $dbh;  /**  * 構造  *   * @return MyPDO  */ private function __construct($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset) {  try {   $this->dsn = 'mysql:host='.$dbHost.';dbname='.$dbName;   $this->dbh = new PDO($this->dsn, $dbUser, $dbPasswd);   $this->dbh->exec('SET character_set_connection='.$dbCharset.', character_set_results='.$dbCharset.', character_set_client=binary');  } catch (PDOException $e) {   $this->outputError($e->getMessage());  } }  /**  * 防止複製  *   */ private function __clone() {}  /**  * Singleton instance  *   * @return Object  */ public static function getInstance($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset) {  if (self::$_instance === null) {   self::$_instance = new self($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset);  }  return self::$_instance; }  /**  * Query 查詢  *  * @param String $strSql SQL語句  * @param String $queryMode 查詢方式(All or Row)  * @param Boolean $debug  * @return Array  */ public function query($strSql, $queryMode = 'All', $debug = false) {  if ($debug === true) $this->debug($strSql);  $recordset = $this->dbh->query($strSql);  $this->getPDOError();  if ($recordset) {   $recordset->setFetchMode(PDO::FETCH_ASSOC);   if ($queryMode == 'All') {    $result = $recordset->fetchAll();   } elseif ($queryMode == 'Row') {    $result = $recordset->fetch();   }  } else {   $result = null;  }  return $result; }  /**  * Update 更新  *  * @param String $table 表名  * @param Array $arrayDataValue 欄位與值  * @param String $where 條件  * @param Boolean $debug  * @return Int  */ public function update($table, $arrayDataValue, $where = '', $debug = false) {  $this->checkFields($table, $arrayDataValue);  if ($where) {   $strSql = '';   foreach ($arrayDataValue as $key => $value) {    $strSql .= ", `$key`='$value'";   }   $strSql = substr($strSql, 1);   $strSql = "UPDATE `$table` SET $strSql WHERE $where";  } else {   $strSql = "REPLACE INTO `$table` (`".implode('`,`', array_keys($arrayDataValue))."`) VALUES ('".implode("','", $arrayDataValue)."')";  }  if ($debug === true) $this->debug($strSql);  $result = $this->dbh->exec($strSql);  $this->getPDOError();  return $result; }  /**  * Insert 插入  *  * @param String $table 表名  * @param Array $arrayDataValue 欄位與值  * @param Boolean $debug  * @return Int  */ public function insert($table, $arrayDataValue, $debug = false) {  $this->checkFields($table, $arrayDataValue);  $strSql = "INSERT INTO `$table` (`".implode('`,`', array_keys($arrayDataValue))."`) VALUES ('".implode("','", $arrayDataValue)."')";  if ($debug === true) $this->debug($strSql);  $result = $this->dbh->exec($strSql);  $this->getPDOError();  return $result; }  /**  * Replace 覆蓋方式插入  *  * @param String $table 表名  * @param Array $arrayDataValue 欄位與值  * @param Boolean $debug  * @return Int  */ public function replace($table, $arrayDataValue, $debug = false) {  $this->checkFields($table, $arrayDataValue);  $strSql = "REPLACE INTO `$table`(`".implode('`,`', array_keys($arrayDataValue))."`) VALUES ('".implode("','", $arrayDataValue)."')";  if ($debug === true) $this->debug($strSql);  $result = $this->dbh->exec($strSql);  $this->getPDOError();  return $result; }  /**  * Delete 刪除  *  * @param String $table 表名  * @param String $where 條件  * @param Boolean $debug  * @return Int  */ public function delete($table, $where = '', $debug = false) {  if ($where == '') {   $this->outputError("'WHERE' is Null");  } else {   $strSql = "DELETE FROM `$table` WHERE $where";   if ($debug === true) $this->debug($strSql);   $result = $this->dbh->exec($strSql);   $this->getPDOError();   return $result;  } }  /**  * execSql 執行SQL語句  *  * @param String $strSql  * @param Boolean $debug  * @return Int  */ public function execSql($strSql, $debug = false) {  if ($debug === true) $this->debug($strSql);  $result = $this->dbh->exec($strSql);  $this->getPDOError();  return $result; }  /**  * 擷取欄位最大值  *   * @param string $table 表名  * @param string $field_name 欄位名  * @param string $where 條件  */ public function getMaxValue($table, $field_name, $where = '', $debug = false) {  $strSql = "SELECT MAX(".$field_name.") AS MAX_VALUE FROM $table";  if ($where != '') $strSql .= " WHERE $where";  if ($debug === true) $this->debug($strSql);  $arrTemp = $this->query($strSql, 'Row');  $maxValue = $arrTemp["MAX_VALUE"];  if ($maxValue == "" || $maxValue == null) {   $maxValue = 0;  }  return $maxValue; }  /**  * 擷取指定列的數量  *   * @param string $table  * @param string $field_name  * @param string $where  * @param bool $debug  * @return int  */ public function getCount($table, $field_name, $where = '', $debug = false) {  $strSql = "SELECT COUNT($field_name) AS NUM FROM $table";  if ($where != '') $strSql .= " WHERE $where";  if ($debug === true) $this->debug($strSql);  $arrTemp = $this->query($strSql, 'Row');  return $arrTemp['NUM']; }  /**  * 擷取表引擎  *   * @param String $dbName 庫名  * @param String $tableName 表名  * @param Boolean $debug  * @return String  */ public function getTableEngine($dbName, $tableName) {  $strSql = "SHOW TABLE STATUS FROM $dbName WHERE Name='".$tableName."'";  $arrayTableInfo = $this->query($strSql);  $this->getPDOError();  return $arrayTableInfo[0]['Engine']; }  /**  * beginTransaction 事務開始  */ private function beginTransaction() {  $this->dbh->beginTransaction(); }  /**  * commit 事務提交  */ private function commit() {  $this->dbh->commit(); }  /**  * rollback 交易回復  */ private function rollback() {  $this->dbh->rollback(); }  /**  * transaction 通過交易處理多條SQL語句  * 調用前需通過getTableEngine判斷表引擎是否支援事務  *  * @param array $arraySql  * @return Boolean  */ public function execTransaction($arraySql) {  $retval = 1;  $this->beginTransaction();  foreach ($arraySql as $strSql) {   if ($this->execSql($strSql) == 0) $retval = 0;  }  if ($retval == 0) {   $this->rollback();   return false;  } else {   $this->commit();   return true;  } }  /**  * checkFields 檢查指定欄位是否在指定資料表中存在  *  * @param String $table  * @param array $arrayField  */ private function checkFields($table, $arrayFields) {  $fields = $this->getFields($table);  foreach ($arrayFields as $key => $value) {   if (!in_array($key, $fields)) {    $this->outputError("Unknown column `$key` in field list.");   }  } }  /**  * getFields 擷取指定資料表中的全部欄位名  *  * @param String $table 表名  * @return array  */ private function getFields($table) {  $fields = array();  $recordset = $this->dbh->query("SHOW COLUMNS FROM $table");  $this->getPDOError();  $recordset->setFetchMode(PDO::FETCH_ASSOC);  $result = $recordset->fetchAll();  foreach ($result as $rows) {   $fields[] = $rows['Field'];  }  return $fields; }  /**  * getPDOError 捕獲PDO錯誤資訊  */ private function getPDOError() {  if ($this->dbh->errorCode() != '00000') {   $arrayError = $this->dbh->errorInfo();   $this->outputError($arrayError[2]);  } }  /**  * debug  *   * @param mixed $debuginfo  */ private function debug($debuginfo) {  var_dump($debuginfo);  exit(); }  /**  * 輸出錯誤資訊  *   * @param String $strErrMsg  */ private function outputError($strErrMsg) {  throw new Exception('MySQL Error: '.$strErrMsg); }  /**  * destruct 關閉資料庫連接  */ public function destruct() {  $this->dbh = null; }}?>

四、調用方法:

<?phprequire 'MyPDO.class.php';$db = MyPDO::getInstance('localhost', 'root', '123456', 'test', 'utf8'); //do something... $db->destruct();?>

總結:以上就是本篇文的全部內容,希望能對大家的學習有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.