之前在《【php】利用php的建構函式與解構函式編寫Mysql資料庫查詢類》(點擊開啟連結)寫過的Mysql資料庫查詢類還不夠完美,利用《【Java】單例模式》(點擊開啟連結)介紹的思想可以將這個資料庫連結類搞成單例,不會因為多個使用者訪問網站就建立一個資料庫查詢執行個體,拖慢整個網站的速度,讓網站的資料庫壓力比較大,造成網站的速度下降得很厲害。
單例實現最關鍵的,還是那3點:
1、私人建構函式,這裡無須像Java那樣私人無參數的建構函式,php不允許有多個建構函式——即使這些建構函式參數不同也不可以。
2、私人複製類的函數
3、暴露一個公有的“創造執行個體函數”供調用,這個“創造執行個體函數”判斷如果已存在相應執行個體,返回此執行個體,沒有才建立。
這樣保證此資料庫連接類有且只有一個。
直接用一個例子說明,資料庫test中有表user
先利用利用單例模式設計資料庫連接Model類,將這張表的內容查詢到網頁上:
具體代碼如下:
<?phpclass 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被單例了,從而達到減少資料庫壓力的目的。