婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP單例模式應用示例【多次連接數據庫只實例化一次】

PHP單例模式應用示例【多次連接數據庫只實例化一次】

熱門標簽:兼職做地圖標注好賺錢嗎 海南外呼系統方案 亳州企業外呼系統 地圖標注怎么做商戶驗證 智能電銷語音機器人資訊 打開百度地圖標注 蘇州外呼系統有效果嗎 山東電銷卡外呼系統原理是什么 400 電話 辦理

本文實例講述了PHP單例模式應用。分享給大家供大家參考,具體如下:

以前剛開始工作的時候經常連接數據庫,每次用到數據庫的時候就要用new進行實例并連接一次,當時因為連接數據庫的次數不是很頻繁,所以也沒什么。后來主管對我說我現在這樣每次都連接數據庫的如果數據讀取頻繁的話對數據庫和系統造成的壓力會很大,讓我想想辦法能不能就連接一次數據庫然后再次用到的時候就不用new一個新的連接了,當時怎么也沒想到好的辦法,知道最近學到了單例模式才恍然大悟,當時主管是引導我用單例模式的,只怪我以前對開發模式不懂。好了廢話少說,下面來看單例模式:

單例模式(職責模式):

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

單例類:

1、構造函數需要標記為private(訪問控制:防止外部代碼使用new操作符創建對象),單例類不能在其他類中實例化,只能被其自身實例化;

2、擁有一個保存類的實例的靜態成員變量

3、擁有一個訪問這個實例的公共的靜態方法(常用getInstance()方法進行實例化單例類,通過instanceof操作符可以檢測到類是否已經被實例化)

另外,需要創建__clone()方法防止對象被復制(克隆)

為什么要使用PHP單例模式?

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

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

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

代碼(官方文檔中的):

?php
class Singletons{
  // 保存類實例在此屬性中
  private static $instance;
  // 構造方法聲明為private,防止直接創建對象
  private function __construct()
  {
    echo 'Iam constructed';
  }
  // singleton 方法
  public static function singleton()
  {
    if (!isset(self::$instance)) {
      $c = __CLASS__;
      self::$instance =new$c;
    }
    return self::$instance;
  }
  // Example類中的普通方法
  public function bark()
  {
    echo 'Woof!';
  }
  // 阻止用戶復制對象實例
  public function __clone()
  {
    trigger_error('Clone is not allowed.',E_USER_ERROR);
  }
}//endclass singletons
  //這個寫法會出錯,因為構造方法被聲明為private
  //$test= new Singletons();
  // 下面將得到Example類的單例對象
  $test= Singletons::singleton();
  $test->bark();
  // 復制對象將導致一個E_USER_ERROR.
  $test_clone= clone $test;
?>

結果:

I am constructed!   Woof!
Fatal error:
Clone is not allowed. in E:\APMServ5.2.6\www\htdocs\Lee\myprogram\other\class\singletons.phpon line 31

以下內容源自網絡(可以參考學習一下):

單例模式的三個要點:

(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(...);
?>

3、深入理解

?php
 class db {
   public $conn;
   public static $sql;
   public static $instance=null;
   private function __construct(){
     require_once('db.config.php');
     $this->conn = mysql_connect($db['host'],$db['user'],$db['password']);
     if(!mysql_select_db($db['database'],$this->conn)){
      echo "失敗";
    };
    mysql_query('set names utf8',$this->conn);
  }
  public static function getInstance(){
    if(is_null(self::$instance)){
      self::$instance = new db;
    }
    return self::$instance;
  }
  /**
   * 查詢數據庫
   */
  public function select($table,$condition=array(),$field = array()){
    $where='';
    if(!empty($condition)){
      foreach($condition as $k=>$v){
        $where.=$k."='".$v."' and ";
      }
      $where='where '.$where .'1=1';
    }
    $fieldstr = '';
    if(!empty($field)){
      foreach($field as $k=>$v){
        $fieldstr.= $v.',';
      }
       $fieldstr = rtrim($fieldstr,',');
    }else{
      $fieldstr = '*';
    }
    self::$sql = "select {$fieldstr} from {$table} {$where}";
    $result=mysql_query(self::$sql,$this->conn);
    $resuleRow = array();
    $i = 0;
    while($row=mysql_fetch_assoc($result)){
      foreach($row as $k=>$v){
        $resuleRow[$i][$k] = $v;
      }
      $i++;
    }
    return $resuleRow;
  }
  /**
   * 添加一條記錄
   */
   public function insert($table,$data){
    $values = '';
    $datas = '';
    foreach($data as $k=>$v){
      $values.=$k.',';
      $datas.="'$v'".',';
    }
    $values = rtrim($values,',');
    $datas  = rtrim($datas,',');
    self::$sql = "INSERT INTO {$table} ({$values}) VALUES ({$datas})";
    if(mysql_query(self::$sql)){
      return mysql_insert_id();
    }else{
      return false;
    };
   }
   /**
   * 修改一條記錄
   */
  public function update($table,$data,$condition=array()){
    $where='';
    if(!empty($condition)){
      foreach($condition as $k=>$v){
        $where.=$k."='".$v."' and ";
      }
      $where='where '.$where .'1=1';
    }
    $updatastr = '';
    if(!empty($data)){
      foreach($data as $k=>$v){
        $updatastr.= $k."='".$v."',";
      }
      $updatastr = 'set '.rtrim($updatastr,',');
    }
    self::$sql = "update {$table} {$updatastr} {$where}";
    return mysql_query(self::$sql);
  }
  /**
   * 刪除記錄
   */
   public function delete($table,$condition){
    $where='';
    if(!empty($condition)){
      foreach($condition as $k=>$v){
        $where.=$k."='".$v."' and ";
      }
      $where='where '.$where .'1=1';
    }
    self::$sql = "delete from {$table} {$where}";
    return mysql_query(self::$sql);
   }
  public static function getLastSql(){
    echo self::$sql;
  }
}
$db = db::getInstance();
//$list = $db->select('demo',array('name'=>'tom','password'=>'ds'),array('name','password'));
//echo $db->insert('demo',array('name'=>'最近你啦','password'=>'123'));
//echo $db->update('demo',array("name"=>'xxx',"password"=>'123'),array('id'=>1));
echo $db->delete('demo',array('id'=>'2'));
db::getLastSql();
echo "pre>";
?>

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

您可能感興趣的文章:
  • PHP單例模式數據庫連接類與頁面靜態化實現方法
  • PHP中數據庫單例模式的實現代碼分享
  • PHP基于單例模式實現的數據庫操作基類
  • PHP實現單例模式最安全的做法
  • php單例模式的簡單實現方法
  • php利用單例模式實現日志處理類庫
  • PHP基于單例模式編寫PDO類的方法
  • PHP最常用的2種設計模式工廠模式和單例模式介紹
  • PHP設計模式之工廠模式與單例模式
  • PHP實現單例模式建立數據庫連接的方法分析

標簽:綏化 安康 紹興 溫州 金華 清遠 萊蕪 呼倫貝爾

巨人網絡通訊聲明:本文標題《PHP單例模式應用示例【多次連接數據庫只實例化一次】》,本文關鍵詞  PHP,單例,模式,應用,示例,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP單例模式應用示例【多次連接數據庫只實例化一次】》相關的同類信息!
  • 本頁收集關于PHP單例模式應用示例【多次連接數據庫只實例化一次】的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美一区二区观看视频| 日韩中文字幕亚洲一区二区va在线| 亚洲美女区一区| 韩国av一区二区三区在线观看| 欧美天堂一区二区三区| 亚洲成人www| 欧美一区二区三区在线看| 久久精品国产99| 国产三级久久久| 国产xxx精品视频大全| 中文字幕在线一区二区三区| 欧美日韩视频第一区| 婷婷国产在线综合| 久久综合九色综合97婷婷女人| 91理论电影在线观看| 久久99国产精品尤物| 亚洲人成网站影音先锋播放| 91麻豆精品国产| 91蜜桃在线观看| 国产成人综合自拍| 偷拍一区二区三区| 国产精品网曝门| www国产亚洲精品久久麻豆| 在线视频一区二区三区| 丁香一区二区三区| 久久精品国产一区二区| 午夜精品久久久久久久99水蜜桃 | 中文乱码免费一区二区| 欧美日韩一级视频| 91视频在线观看免费| 国产精品一二二区| 日韩成人精品在线| 亚洲一区二区影院| 国产精品传媒在线| 国产三级三级三级精品8ⅰ区| 欧美一区三区四区| 91精品国产丝袜白色高跟鞋| 欧美日韩在线一区二区| 欧美性极品少妇| 欧美日韩五月天| 欧美一区在线视频| 日韩精品一区在线| 久久久亚洲午夜电影| 欧美国产日产图区| 亚洲图片另类小说| 亚洲免费看黄网站| 日韩精品1区2区3区| 免费在线观看成人| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 免费在线观看精品| 日日摸夜夜添夜夜添国产精品| 日韩1区2区3区| 国产精品综合二区| 成人美女在线视频| 在线日韩一区二区| 精品久久国产97色综合| 1000精品久久久久久久久| 午夜免费久久看| 国产91丝袜在线观看| 99re热这里只有精品视频| 在线不卡a资源高清| 中文字幕欧美一区| 麻豆成人91精品二区三区| 不卡的av电影在线观看| 91精品国产全国免费观看| 欧美国产日韩亚洲一区| 久久精品国产一区二区三| 99r国产精品| 中文字幕成人av| 免费人成黄页网站在线一区二区| 成人性生交大片免费看视频在线| 91精品国产欧美一区二区成人| 亚洲免费观看高清完整版在线观看| 奇米精品一区二区三区在线观看 | 国产精品福利一区二区三区| 亚洲影视资源网| 成人夜色视频网站在线观看| 欧美精品高清视频| 亚洲国产精品久久一线不卡| 99re热这里只有精品免费视频| 2023国产精华国产精品| 日本aⅴ免费视频一区二区三区| 91影院在线观看| 国产精品久久久久久久裸模| 激情综合色综合久久| 欧美精品一区二区三| 日本午夜一区二区| 26uuu欧美日本| 成人激情动漫在线观看| 国产精品天干天干在观线| 成人av在线播放网址| 国产欧美中文在线| 91精品国产综合久久香蕉的特点| 日韩国产欧美一区二区三区| 欧美日韩精品一区视频| 日韩一区二区三区在线| 久久久精品2019中文字幕之3| 精品捆绑美女sm三区| 国产亚洲美州欧州综合国 | 国产凹凸在线观看一区二区| 国产精品人人做人人爽人人添| 色偷偷一区二区三区| 日本成人在线电影网| 国产精品青草综合久久久久99| 99国产精品久| 国产盗摄一区二区| 国产精品久久久久久久久免费丝袜| 欧美性xxxxxx少妇| 蜜桃视频一区二区三区在线观看| 一区在线播放视频| 精品久久久久久久一区二区蜜臀| 91女神在线视频| 久久精品国产秦先生| 综合久久综合久久| 久久久久久久久久久99999| 欧美日韩一区在线| 不卡视频在线看| 精品无人码麻豆乱码1区2区| 偷拍一区二区三区四区| 亚洲午夜国产一区99re久久| 亚洲欧美影音先锋| 国产精品高清亚洲| 成人欧美一区二区三区小说 | 日本成人中文字幕在线视频| 亚洲国产成人av| 日韩国产欧美视频| 日日噜噜夜夜狠狠视频欧美人| **性色生活片久久毛片| 国产精品欧美一区喷水| 日韩精品影音先锋| 精品久久国产老人久久综合| 久久夜色精品一区| 欧美videos中文字幕| 欧美va天堂va视频va在线| 欧美精品丝袜中出| 久久综合狠狠综合久久综合88| 国产亚洲制服色| 日韩一区在线播放| 亚洲亚洲精品在线观看| 蜜臀av在线播放一区二区三区| 五月激情六月综合| 国产精品香蕉一区二区三区| 99久久99久久精品免费观看| 欧美日韩精品免费| 久久亚洲精品小早川怜子| 中文字幕精品一区| 图片区日韩欧美亚洲| 不卡一区二区中文字幕| 欧美猛男gaygay网站| 国产喂奶挤奶一区二区三区| 欧美福利视频一区| 中文字幕欧美一| 国产一区二区在线电影| 欧美美女视频在线观看| 国产精品不卡一区二区三区| 激情综合色播激情啊| 欧美色图免费看| 亚洲四区在线观看| 国产99久久精品| 日韩免费一区二区三区在线播放| 欧美激情在线看| 麻豆精品在线播放| 色婷婷亚洲婷婷| 亚洲欧美国产高清| 国产精品一区三区| 精品电影一区二区三区| 日本一区中文字幕| 91精品国产综合久久久久| 亚洲视频1区2区| 成人自拍视频在线| 中文无字幕一区二区三区| 国产精品影视网| 国产欧美日韩在线| 国产永久精品大片wwwapp| 久久影院视频免费| 国产传媒久久文化传媒| 国产精品少妇自拍| 久久电影网电视剧免费观看| 日韩免费看网站| 国产精品自拍av| 亚洲人快播电影网| 一本到一区二区三区| 亚洲图片一区二区| 日韩视频一区二区| 国产99精品在线观看| 亚洲小少妇裸体bbw| 欧美电影免费观看高清完整版在线 | 久久99精品国产麻豆婷婷| 91精品国产黑色紧身裤美女| 亚洲一区二区黄色| 日韩三级免费观看| 成人精品免费视频| 日韩精品电影在线| 久久精品在线免费观看| 91精彩视频在线| 国产中文字幕精品| 中文字幕不卡在线播放| 日韩欧美成人激情| 色婷婷激情一区二区三区| 国产一区二区三区四区五区美女|