單例模式概念
單例模式是指整個應用中類只有一個對象實例的設計模式。
單例模式的特點
我用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和數據庫連接關閉操作是非常消耗資源的
改進:
每次應該直接返回當前應用中已經打開的數據庫連接句柄
- //單例模式返回數據庫連接句柄
- $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類從而失去單例模式意義
- 必須提供一個訪問這個實例的公共靜態方法,從而返回唯一實例的一個引用
