首頁  >  文章  >  後端開發  >  php單例模式設計資料庫並連接Model類

php單例模式設計資料庫並連接Model類

小云云
小云云原創
2018-03-29 10:53:041603瀏覽

利用《【Java】單例模式》(點擊開啟連結)介紹的想法可以將這個資料庫連結類別搞成單例,不會因為多個使用者造訪網站就建立一個資料庫查詢實例,拖慢整個網站的速度,讓網站的資料庫壓力比較大,造成網站的速度下降得很厲害。

單例實作最關鍵的,還是那3點:

1、私有建構函數,這裡無須像Java那樣私有無參數的建構函數,php不允許有多個建構函數-即使這些建構函式參數不同也不可以。

2、私有克隆類別的函數

3、暴露一個公有的「創造實例函數」供調用,這個「創造實例函數」判斷如果已存在相應實例,返回此實例,沒有才創建。

這樣保證此資料庫連接類別有且只有一個。

直接用一個例子說明,資料庫test中有表user


#先利用利用單例模式設計資料庫連接Model類,將這張表的內容查詢到網頁上:


  1. <?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[&#39;id&#39;].",".$row[&#39;username&#39;].",".$row[&#39;password&#39;]."<br/>";  
    }    
    ?>


這樣保證了class db所對應的實例$dbconnector有且只有一個,再有一句:

  1. #
    $dbconnector1
    =db::getInstance(
    "localhost"
    ,
    "root"
    ,
    "root"
    ,
    "test"
    );
    //创建数据库连接类


##還是會傳回原來的已經建立實例$dbconnector,更應該說操作$dbconnector與$dbconnector1是同樣的效果,它們就是同一個東西,不會在伺服器的記憶體上多開闢資源來存放$dbconnector與$dbconnector1,因為db被單例了,從而達到減少資料庫壓力的目的。

相關推薦:

#設計資料庫之經驗談_PHP教學#

以上是php單例模式設計資料庫並連接Model類的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn