亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP單例模式是什么 php實現單例模式的方法

2024-05-04 23:45:59
字體:
來源:轉載
供稿:網友
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、普通的數據庫訪問例子:

<?php ...... //初始化一個數據庫句柄 $db = new DB(...);  //添加用戶信息 $db->addUserInfo(...);  ......  //在函數中訪問數據庫,查找用戶信息 function getUserInfo() {   $db = new DB(...);//再次new 數據庫類,和數據庫建立連接   $db = query(....);//根據查詢語句訪問數據庫 }  ?> 

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

<?php 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操作數據庫類的一個封裝,采用了單例模式:

<?php/** * 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;  }}?>

調用方法:

<?phprequire 'MyPDO.class.php';$db = MyPDO::getInstance('localhost', 'root', '123456', 'test', 'utf8');$db->query("select count(*) frome table");$db->destruct();?>

以上就是本文的全部內容,希望對大家學習php程序設計有所幫助。



注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人综合一区二区三区| 国产精品久久久久91| 亚洲综合在线播放| 亚洲成人黄色在线| 欧洲精品久久久| 精品一区二区电影| 色99之美女主播在线视频| 欧美成人免费大片| 日本精品免费一区二区三区| 久热精品视频在线免费观看| 一本色道久久88综合亚洲精品ⅰ| 视频在线观看一区二区| 大胆人体色综合| 亚洲欧美精品一区二区| 国产日本欧美一区二区三区在线| 欧美激情在线一区| 69久久夜色精品国产7777| 揄拍成人国产精品视频| 国产成人在线播放| 在线观看精品国产视频| 亚洲第一网站男人都懂| 国产日韩精品在线观看| 一区二区三区亚洲| 热久久免费视频精品| 亚洲少妇中文在线| 深夜福利国产精品| 亚洲国产精品字幕| 亚洲香蕉av在线一区二区三区| 国产精品美腿一区在线看| www.日韩av.com| 国产精品观看在线亚洲人成网| 亚洲欧美综合v| 国语自产精品视频在线看一大j8| 亚洲国产精品专区久久| 久久精品这里热有精品| 在线精品播放av| 欧美视频在线观看 亚洲欧| 中文国产亚洲喷潮| 国产国语刺激对白av不卡| 久久人人爽人人爽人人片av高请| 久久成人18免费网站| 亚洲国产99精品国自产| 91精品啪在线观看麻豆免费| 91九色国产社区在线观看| 夜夜嗨av色一区二区不卡| 97在线看福利| 亚洲第一国产精品| 日韩在线观看免费高清| 青青青国产精品一区二区| 中文字幕在线观看亚洲| 97精品国产91久久久久久| 中文字幕综合一区| 欧美xxxx18性欧美| 欧美人交a欧美精品| 欧美专区福利在线| 国产精品69久久| 精品国产乱码久久久久久虫虫漫画| 亚洲午夜国产成人av电影男同| 日韩成人av网| 国产精品免费一区豆花| 亚洲成人av在线播放| 97精品视频在线观看| 日韩精品在线私人| 精品久久久久久久久久久久久久| 亚洲女人天堂网| 国产性猛交xxxx免费看久久| 亚洲欧美日韩一区在线| 亚洲欧美日韩高清| 亚洲一级片在线看| 欧美日韩亚洲精品一区二区三区| 成人免费直播live| 亚洲天堂网在线观看| 日韩在线观看免费全| 亚洲欧美日韩国产成人| 成人免费网视频| 久久精品91久久久久久再现| 亚洲欧美一区二区三区久久| 久热国产精品视频| 7777免费精品视频| 欧美夫妻性视频| 国产精品第1页| 欧美国产日本在线| 国产91在线高潮白浆在线观看| 亚洲黄色www网站| 91在线视频精品| 精品国产乱码久久久久久虫虫漫画| 国产精品一区二区久久国产| 国产视频久久网| 久久五月天色综合| 日韩精品极品视频免费观看| 欧美一性一乱一交一视频| 欧美性少妇18aaaa视频| 欧美性xxxxx极品| 久久黄色av网站| 国产主播喷水一区二区| 九色精品美女在线| 国产一区二区三区三区在线观看| 国产精品尤物福利片在线观看| 日韩av在线免费观看一区| 高清日韩电视剧大全免费播放在线观看| 国产亚洲欧洲高清一区| 日本亚洲欧美三级| 日韩欧美国产一区二区| 亚洲二区在线播放视频| 一本大道香蕉久在线播放29| 姬川优奈aav一区二区| 中文字幕欧美国内| 日韩动漫免费观看电视剧高清| 中文字幕无线精品亚洲乱码一区| 日韩激情片免费| 美女少妇精品视频| 国产精品视频在线播放| 在线精品国产成人综合| 久久精品美女视频网站| 日本在线精品视频| 欧美日产国产成人免费图片| 伊人久久五月天| 91老司机在线| 色一情一乱一区二区| 92裸体在线视频网站| 91系列在线播放| 成人黄色av播放免费| 国产成人a亚洲精品| 在线免费观看羞羞视频一区二区| 日韩福利视频在线观看| 精品视频久久久| 日韩av手机在线| 亚洲天堂成人在线视频| 日韩va亚洲va欧洲va国产| 国产福利精品视频| 亚洲欧美福利视频| 国产丝袜一区二区三区| 国产91精品黑色丝袜高跟鞋| 在线观看91久久久久久| 成人两性免费视频| 欧美一区二区三区精品电影| 精品久久中文字幕| 亚洲精品国产品国语在线| 国产这里只有精品| 国产日韩av在线播放| 国产成人精品a视频一区www| 国产91精品视频在线观看| 青青草99啪国产免费| 91精品久久久久久久久久另类| 国产精品久久久久久亚洲影视| 久久久久久av| 久久精品99国产精品酒店日本| www.精品av.com| 欧美日韩不卡合集视频| 亚洲国产精品悠悠久久琪琪| 精品久久香蕉国产线看观看gif| 亚洲欧洲一区二区三区在线观看| 伊人久久精品视频| 久久影院免费观看| 欧美老少做受xxxx高潮| www.亚洲天堂| 日本高清不卡的在线| 欧美在线xxx| 亚洲男子天堂网| 亚洲色图五月天| 国产精品爽爽爽爽爽爽在线观看| 亚洲情综合五月天| 亚洲人在线观看| 亚洲毛片在线观看|