php單例模式使用實例之數據庫連接

單例模式概念

單例模式是指整個應用中類只有一個對象實例的設計模式。

單例模式的特點

  • 一個類在整個應用中只有一個實例
  • 類必須自行創建這個實例
  • 必須自行向整個系統提供這個實例

php中使用單例模式的原因

我用php大部分操作都是和各種數據庫打交道,包括mysql,redis,memcache等各種關係型和非關係型數據庫,所以一個應用中會 存在大量連接數據庫的操作,如果不用單例模式,那每次都要new操作,但是每次new都會消耗大量的內存資源和系統資源,而且每次打開和關閉數據庫連接都 是對數據庫的一種極大考驗和浪費。
貼出我之前常用的不好的數據庫連接代碼,給大家一個錯誤示範:
<?php  
    class MysqlConn  
    {  
        // MYSQL數據庫連接信息  
        const MYSQLHOSTNAME = "127.0.0.1";  
        const MYSQLUSERNAME = "root";  
        const MYSQLPASSWORD = "***";  
        const MYSQLDBNAME = "test";  
        const MYSQLCHARSET = "utf8";  
          
        /** 
        * Description:mysql數據庫連接函數 
        * Return value:連接成功返回數據庫連接句柄;連接失敗返回錯誤消息 
        */  
        public function MysqlConnect()  
        {  
            $db = new mysqli(self::MYSQLHOSTNAME, self::MYSQLUSERNAEM, self::MYSQLPASSWORD, self::MYSQLDBNAME); // 連接數據庫  
            $db->set_charset(self::MYSQLCHARSET);  
            if (mysqli_connect_errno())  
            {  
                throw new CircleMysqlException("服務器系統故障", 1001);  
            }  
            else  
            {  
                return $db;  
            }  
        }  
    }  



缺陷:
每次數據庫連接都要new這個類,然後調用mysqlconnect方法,返回close掉,頻繁的new和數據庫連接關閉操作是非常消耗資源的

每次應該直接返回當前應用中已經打開的數據庫連接句柄

 
  1. //單例模式返回數據庫連接句柄  
  2. $db = MysqlConn::SingleMysqlConnect();  

php單例模式的實現

    <?php  
    class Singleton  
    {  
        /** 
         * Description:(1)靜態變量,保存全局實例,跟類綁定,跟對象無關 
         *             (2)私有屬性,爲了避免類外直接調用 類名::$instance,防止爲空 
         */  
        private static $instance;  
          
        /** 
         * Description:數據庫連接句柄 
         */  
        private $db;  
          
        /** 
         * Description:私有化構造函數,防止外界實例化對象 
         */  
        private static function __construct()  
        {  
        }  
          
        /** 
         * Description:私有化克隆函數,防止外界克隆對象 
         */  
        private function __clone()  
        {  
        }  
          
        /** 
         * Description:靜態方法,單例訪問統一入口 
         * @return Singleton:返回應用中的唯一對象實例 
         */  
        public static function GetInstance()  
        {  
            if (!(self::$instance instanceof self))  
            {  
                self::$instance = new self();  
            }  
            return self::$instance;  
        }  
          
        /** 
         * Description:獲取數據庫的私有方法的連接句柄 
         */  
        public function GetDbConnect()  
        {  
            return $this->db;  
        }  
    }  


  • 需要一個保存類的唯一實例的靜態成員變量(通常$instance爲私有變量)
  • 構造函數和克隆函數必須聲明爲私有的,爲了防止外部程序new類從而失去單例模式意義
  • 必須提供一個訪問這個實例的公共靜態方法,從而返回唯一實例的一個引用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章