1. 程式人生 > >【php】利用單例模式設計資料庫連線Model類

【php】利用單例模式設計資料庫連線Model類

之前在《【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被單例了,從而達到減少資料庫壓力的目的。