【php】利用單例模式設計資料庫連線Model類
阿新 • • 發佈:2019-01-28
之前在《【php】利用php的建構函式與解構函式編寫Mysql資料庫查詢類》(點選開啟連結)寫過的Mysql資料庫查詢類還不夠完美,利用《【Java】單例模式》(點選開啟連結)介紹的思想可以將這個資料庫連結類搞成單例,不會因為多個使用者訪問網站就建立一個數據庫查詢例項,拖慢整個網站的速度,讓網站的資料庫壓力比較大,造成網站的速度下降得很厲害。
單例實現最關鍵的,還是那3點:
1、私有建構函式,這裡無須像Java那樣私有無引數的建構函式,php不允許有多個建構函式——即使這些建構函式引數不同也不可以。
2、私有克隆類的函式
3、暴露一個公有的“創造例項函式”供呼叫,這個“創造例項函式”判斷如果已存在相應例項,返回此例項,沒有才建立。
這樣保證此資料庫連線類有且只有一個。
直接用一個例子說明,資料庫test中有表user
先利用利用單例模式設計資料庫連線Model類,將這張表的內容查詢到網頁上:
具體程式碼如下:
<?php class db{ private $link; //db類單例開始 //儲存類例項的私有靜態成員變數 private static $_instance; //定義一個私有的建構函式,確保單例類不能通過new關鍵字例項化,只能被其自身例項化 private function __construct($host,$username,$password,$database){ $this->link=mysql_connect($host,$username,$password); if(!$this->link){ die("連線失敗!"); } mysql_query("set names utf8;"); mysql_select_db($database); } //定義私有的__clone()方法,確保單例類不能被複制或克隆 private function __clone(){} public static function getInstance($host, $username, $password,$database) { //檢測類是否被例項化 if(!(self::$_instance instanceof self)){ self::$_instance=new db($host,$username,$password,$database); } return self::$_instance; } //執行SQL語句 public function query($query){ return mysql_query($query, $this->link); } //關閉資料庫連線 public function close(){ return mysql_close($this->link); } } //呼叫單例類測試部分 header("Content-type: text/html; charset=utf-8"); //設定網頁編碼 $dbconnector=db::getInstance("localhost","root","root","test");//建立資料庫連線類 $result=$dbconnector->query("select * from user");//查詢資料庫 for($i=0;$row=mysql_fetch_array($result);$i++){//列印查詢結果 echo $row['id'].",".$row['username'].",".$row['password']."<br/>"; } ?>
這樣保證了class db所對應的例項$dbconnector有且只有一個,再有一句:
$dbconnector1=db::getInstance("localhost","root","root","test");//建立資料庫連線類
還是會返回原來的已經建立例項$dbconnector,更應該說操作$dbconnector與$dbconnector1是同樣的效果,它們就是同一個東西,不會在伺服器的記憶體上多開闢資源來存放$dbconnector與$dbconnector1,因為db被單例了,從而達到減少資料庫壓力的目的。