利用《【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被單例了,從而達到減少資料庫壓力的目的。
相關推薦:
以上是php單例模式設計資料庫並連接Model類的詳細內容。更多資訊請關注PHP中文網其他相關文章!