243516.com-色综合天天综合网天天看片 ,性欧美欧美巨大69,国产精品a久久久久久,欧美精品一区二区久久婷婷

首頁 - PHP編程

php實現單例模式的方法

一、什么是單例模式?
1、含義   
   作為對象的創建模式,單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統全局地提供這個實例。它不會創建實例副本,而是會向單例類內部存儲的實例返回一個引用。
2、單例模式的三個要點:
(1). 需要一個保存類的唯一實例的靜態成員變量:
private static $_instance;   
(2). 構造函數和克隆函數必須聲明為私有的,防止外部程序new類從而失去單例模式的意義:

private function __construct()  

{  

  $this->_db = pg_connect('xxxx'); 

}  

private function __clone() 

}//覆蓋__clone()方法,禁止克隆

(3). 必須提供一個訪問這個實例的公共的靜態方法(通常為getInstance方法),從而返回唯一實例的一個引用 

public static function getInstance()  

{  

  if(! (self::$_instance instanceof self) )  

  {  

    self::$_instance = new self();  

  } 

  return self::$_instance;  

   

}

二、為什么要使用單例模式?
1、PHP缺點: 
PHP語言是一種解釋型的腳本語言,這種運行機制使得每個PHP頁面被解釋執行后,所有的相關資源都會被回收。也就是說,PHP在語言級別上沒有辦法讓某個對象常駐內存,這和asp.net、Java等編譯型是不同的,比如在Java中單例會一直存在于整個應用程序的生命周期里,變量是跨頁面級的,真正可以做到這個實例在應用程序生命周期中的唯一性。然而在PHP中,所有的變量無論是全局變量還是類的靜態成員,都是頁面級的,每次頁面被執行時,都會重新建立新的對象,都會在頁面執行完畢后被清空,這樣似乎PHP單例模式就沒有什么意義了,所以PHP單例模式我覺得只是針對單次頁面級請求時出現多個應用場景并需要共享同一對象資源時是非常有意義的。

2、單例模式在PHP中的應用場合:
(1)、應用程序與數據庫交互
一個應用中會存在大量的數據庫操作,比如過數據庫句柄來連接數據庫這一行為,使用單例模式可以避免大量的new操作,因為每一次new操作都會消耗內存資源和系統資源。
(2)、控制配置信息
如果系統中需要有一個類來全局控制某些配置信息, 那么使用單例模式可以很方便的實現.

三、如何實現單例模式?
1、普通的數據庫訪問例子:

...... 

//初始化一個數據庫句柄 

$db = new DB(...); 

   

//添加用戶信息 

$db->addUserInfo(...); 

   

...... 

   

//在函數中訪問數據庫,查找用戶信息 

function getUserInfo() 

  $db = new DB(...);//再次new 數據庫類,和數據庫建立連接 

  $db = query(....);//根據查詢語句訪問數據庫 

}   

?>

2、應用單例模式對數據庫進行操作:

class DB  

{  

  private $_db;  

  private static $_instance;  

    

  private function __construct(...)  

  {  

    $this->_db = pg_connect(...);//postgrsql  

  }  

    

  private function __clone() {}; //覆蓋__clone()方法,禁止克隆  

    

  public static function getInstance()  

  {  

    if(! (self::$_instance instanceof self) ) {  

      self::$_instance = new self();  

    }  

    return self::$_instance;  

  }  

    

  public function addUserInfo(...) 

  { 

  } 

   public function getUserInfo(...) 

  {  

  } 

   

   

//test  

$db = DB::getInstance();  

$db->addUserInfo(...);  

$db->getUserInfo(...);  

?>

下面的代碼是PDO操作數據庫類的一個封裝,采用了單例模式:

/**

 * MyPDO

 */

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;

  }

}

?>

調用方法: 

<?php

require 'MyPDO.class.php';

$db = MyPDO::getInstance('localhost', 'root', '123456', 'test', 'utf8');

$db->query("select count(*) frome table");

$db->destruct();

?>

以上內容就是關于php實現單例模式的方法。希望能幫助到大家。

243516.com-色综合天天综合网天天看片 ,性欧美欧美巨大69,国产精品a久久久久久,欧美精品一区二区久久婷婷
欧美韩国日本不卡| 天堂蜜桃91精品| 99r国产精品| 亚洲天堂网中文字| 欧美私模裸体表演在线观看| 亚洲一二三四在线| 在线影院国内精品| 亚洲精品国产a| 欧美日韩久久一区二区| 青青草国产精品97视觉盛宴| 日韩欧美一区在线观看| 国产精品99久久久久| 国产精品系列在线| 91蜜桃网址入口| 亚洲成人av一区二区三区| 在线成人免费观看| 久久国产生活片100| 欧美videos中文字幕| 国产成人福利片| 国产精品久久久久久久午夜片| 99精品视频一区| 亚洲精品免费在线观看| 欧美日韩成人在线一区| 精品一区二区三区不卡| 国产精品久久久久久户外露出 | 激情综合网av| 国产精品免费视频一区| 在线免费av一区| 麻豆91免费观看| 国产精品女人毛片| 欧美日韩精品一区二区在线播放| 老司机免费视频一区二区三区| 欧美激情综合在线| 日本二三区不卡| 免费在线看一区| 亚洲国产激情av| 欧美在线视频全部完| 精品亚洲国产成人av制服丝袜| 国产精品久久久久9999吃药| 欧美亚洲综合另类| 激情另类小说区图片区视频区| 中文字幕一区三区| 6080yy午夜一二三区久久| 国产高清精品久久久久| 亚洲日本中文字幕区| 在线精品视频免费观看| 蜜臀久久99精品久久久久久9| 国产人妖乱国产精品人妖| 欧美性大战久久久久久久蜜臀| 黑人巨大精品欧美一区| 亚洲人成精品久久久久| 日韩美女一区二区三区四区| 99re热这里只有精品免费视频| 五月婷婷综合网| 中文字幕成人av| 欧美一级高清大全免费观看| 成人app下载| 免费成人美女在线观看| 亚洲欧美韩国综合色| 精品久久人人做人人爽| 91精品91久久久中77777| 国产在线一区二区综合免费视频| 亚洲伦理在线精品| 久久久亚洲国产美女国产盗摄 | 秋霞av亚洲一区二区三| 亚洲免费av网站| 久久久久久麻豆| 在线成人小视频| 色悠久久久久综合欧美99| 国产综合久久久久久久久久久久| 亚洲成人黄色影院| 国产精品短视频| 久久久久久麻豆| 欧美一级夜夜爽| 欧美亚一区二区| av一区二区三区在线| 激情综合色综合久久综合| 亚洲精品国产成人久久av盗摄| 久久人人爽爽爽人久久久| 欧美日韩国产高清一区二区三区 | 精品亚洲成a人| 三级在线观看一区二区| 伊人色综合久久天天| 欧美激情中文字幕| 2023国产精华国产精品| 9191久久久久久久久久久| 色菇凉天天综合网| caoporm超碰国产精品| 日韩电影在线观看电影| 亚洲欧美在线另类| 国产欧美日韩中文久久| 精品国产91久久久久久久妲己| 精品视频在线免费观看| 91丨国产丨九色丨pron| 成人精品小蝌蚪| 韩国精品一区二区| 美女视频网站久久| 三级影片在线观看欧美日韩一区二区| 国产亚洲欧美激情| 久久午夜免费电影| 欧美www视频| 日韩欧美123| 欧美一区二区三区喷汁尤物| 欧美日韩一区二区在线观看| 色婷婷综合视频在线观看| 99久久伊人精品| av电影一区二区| 大美女一区二区三区| 久久精品国产澳门| 美女在线视频一区| 麻豆精品视频在线观看免费| 青青草国产成人99久久| 青青草国产成人av片免费| 蜜臀av一区二区在线观看 | 五月激情丁香一区二区三区| 亚洲综合久久久| 亚洲综合久久久久| 亚洲国产日韩精品| 丝袜国产日韩另类美女| 日韩电影在线一区二区| 亚洲国产视频在线| 亚洲va欧美va人人爽| 亚洲第一av色| 日本网站在线观看一区二区三区| 天天免费综合色| 奇米精品一区二区三区在线观看 | 日韩精品一区在线| 日韩欧美国产综合在线一区二区三区| 日韩免费电影网站| 久久久三级国产网站| 国产欧美日韩不卡| 国产精品久久久久影院老司| 国产欧美日韩久久| 国产人妖乱国产精品人妖| 中文字幕一区二区三区精华液 | 91天堂素人约啪| 欧美色网站导航| 欧美一区二区视频免费观看| 日韩精品一区二区在线| 久久一区二区三区国产精品| 亚洲国产成人一区二区三区| 综合久久国产九一剧情麻豆| 亚洲欧美成人一区二区三区| 一区二区在线观看av| 亚洲成av人片一区二区| 麻豆成人在线观看| 国产98色在线|日韩| 91网页版在线| 欧美疯狂做受xxxx富婆| 精品国产精品一区二区夜夜嗨| 国产亚洲一区二区三区在线观看 | 一区二区三区国产豹纹内裤在线| 欧美日韩不卡一区二区| 精品欧美黑人一区二区三区| 亚洲女与黑人做爰| 久久er99热精品一区二区| 91在线播放网址| 精品久久久三级丝袜| 一区二区三区欧美激情| 激情久久五月天| 在线视频国内一区二区| 久久久亚洲精品一区二区三区| 亚洲一卡二卡三卡四卡无卡久久| 国产精品夜夜爽| 欧美日韩精品一区二区三区蜜桃| 国产三级精品三级在线专区| 亚洲va韩国va欧美va| 成人黄色大片在线观看| 日韩一区二区在线观看视频 | 美女国产一区二区三区| 色综合天天综合网天天狠天天| 欧美白人最猛性xxxxx69交| 亚洲免费看黄网站| 国产一区二区导航在线播放| 欧美欧美欧美欧美首页| 国产精品国产三级国产有无不卡| 蜜桃视频第一区免费观看| 91麻豆免费看片| 久久精品视频在线看| 奇米777欧美一区二区| 91麻豆免费看片| 国产日产欧美一区| 蜜桃一区二区三区在线| 欧美优质美女网站| 中文字幕第一区二区| 极品少妇xxxx精品少妇| 在线不卡一区二区| 一区二区三区鲁丝不卡| 成人精品国产福利| 2欧美一区二区三区在线观看视频| 香蕉久久夜色精品国产使用方法 | 欧美精品一卡二卡| 亚洲蜜臀av乱码久久精品| 国产精品白丝jk白祙喷水网站| 欧美妇女性影城| 亚洲高清不卡在线观看| 91麻豆.com| 中文字幕在线观看一区| 国产精品综合视频| 精品日韩成人av|