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

首頁 > 語言 > PHP > 正文

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

2024-05-05 00:05:53
字體:
來源:轉載
供稿:網友

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

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

單例模式(職責模式):

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

單例類:

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

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

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

另外,需要創建__clone()方法防止對象被復制(克?。?/p>

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

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

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

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

代碼(官方文檔中的):

<?phpclass 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品电影网在线观看| 国产精品视频精品视频| 亚洲成人精品视频在线观看| 欧美国产第一页| 欧美性猛交xxxxx免费看| 97超级碰碰人国产在线观看| 欧美最近摘花xxxx摘花| 亚洲欧美中文字幕| 亚洲电影免费观看高清完整版在线| 精品美女久久久久久免费| 亚洲精品动漫久久久久| 久久久久久久久久国产精品| 亚洲精品99999| 91亚洲永久免费精品| 久久久999国产精品| 青青在线视频一区二区三区| 国产精品美女免费视频| 欧美日本高清一区| 国产精品7m视频| 97久久精品在线| 久久在线免费观看视频| 欧美大片在线免费观看| 日韩电影中文字幕一区| 精品福利在线视频| 97av视频在线| 国产亚洲精品久久久优势| 国产亚洲一区二区精品| 日韩激情第一页| 久久伊人免费视频| 97视频在线观看免费高清完整版在线观看| 一本大道香蕉久在线播放29| 欧美最猛性xxxxx免费| 欧美电影免费在线观看| 日韩欧美中文字幕在线播放| 97精品国产97久久久久久免费| 久久97久久97精品免视看| 欧美精品免费在线观看| 日韩精品有码在线观看| 国产精品福利网| 欧美成人一区在线| 久久久久久国产精品三级玉女聊斋| 成人黄色免费在线观看| 日韩欧美精品网址| 亚洲精品久久久久| 亚洲国产一区自拍| 日本中文字幕久久看| 成人情趣片在线观看免费| 亚洲a区在线视频| 欧美人交a欧美精品| 日韩精品免费电影| 国产美女久久精品| 欧美亚州一区二区三区| 亚洲精品影视在线观看| 国产一区私人高清影院| 久久免费视频在线观看| 91成人在线播放| 久久69精品久久久久久久电影好| 色综合久久88| 一本色道久久88综合亚洲精品ⅰ| 久久久视频免费观看| 色av吧综合网| 国产在线a不卡| 日韩精品在线观看一区| 久久久久久尹人网香蕉| 九九久久综合网站| 久久精品亚洲热| 亚洲国产精品人久久电影| 日本韩国欧美精品大片卡二| 国产脚交av在线一区二区| 亚洲黄色免费三级| 在线免费观看羞羞视频一区二区| 国模视频一区二区| 日韩av中文字幕在线播放| 亚洲精品影视在线观看| 日韩中文字幕在线播放| 国产精品久久久久久久久影视| 激情成人在线视频| 精品偷拍各种wc美女嘘嘘| 国产精品video| 欧美日韩黄色大片| 精品欧美国产一区二区三区| 久久香蕉频线观| 亚洲xxxx视频| 国产欧亚日韩视频| 欧美最猛黑人xxxx黑人猛叫黄| 日韩欧美在线播放| 97视频在线观看成人| 国产久一一精品| 欧美肥老太性生活视频| 在线观看91久久久久久| 综合网中文字幕| 国产精品白丝jk喷水视频一区| 精品欧美国产一区二区三区| 欧美日韩亚洲视频一区| 九九热这里只有精品免费看| 中文字幕欧美日韩va免费视频| 日韩av色在线| 这里只有精品视频在线| 欧美福利视频在线观看| 色诱女教师一区二区三区| 亚洲三级 欧美三级| 久久成人免费视频| 欧美高跟鞋交xxxxhd| 亚洲品质视频自拍网| 欧美另类99xxxxx| 国产精品永久在线| 亚洲国产欧美日韩精品| 97不卡在线视频| 美女扒开尿口让男人操亚洲视频网站| 久久精品国产视频| 在线观看国产精品日韩av| 91chinesevideo永久地址| 成人免费黄色网| 欧美成人午夜影院| 在线亚洲欧美视频| 成人a在线视频| 亚洲最大在线视频| 高清日韩电视剧大全免费播放在线观看| 国产精品伦子伦免费视频| 亚洲精品国产综合区久久久久久久| 中文字幕亚洲一区| 欧美性xxxxx| 亚洲а∨天堂久久精品喷水| 国产欧美精品xxxx另类| 日韩福利视频在线观看| 欧美在线免费视频| 欧美寡妇偷汉性猛交| 色99之美女主播在线视频| 欧美有码在线观看| 欧美日韩亚洲一区二区三区| 国产精品69久久久久| 国产精品黄页免费高清在线观看| 色播久久人人爽人人爽人人片视av| 日韩欧美国产免费播放| 一区二区三区日韩在线| 久久精品人人爽| 国产成人欧美在线观看| 日韩福利在线播放| 91中文字幕在线| 毛片精品免费在线观看| 成人久久18免费网站图片| 日日骚av一区| 亚州国产精品久久久| 亚洲免费av网址| 日韩美女主播视频| 国产一区二区三区在线| 中文欧美日本在线资源| 久久久久久久色| 日韩av在线电影网| 欧美丰满片xxx777| 久久香蕉国产线看观看网| 国产精品www色诱视频| 在线观看国产欧美| 国产精品久久精品| 欧美精品18videosex性欧美| 91豆花精品一区| 欧美日韩国产一区二区| 国产欧美精品一区二区三区-老狼| 国产成人aa精品一区在线播放| 亚洲精品色婷婷福利天堂| 国产精品高潮呻吟视频| 国产精品6699| 中文字幕日韩av| 欧美刺激性大交免费视频|