單例模式概念
單例模式的特點
- 一個類在整個應用中只有一個實例
- 類必須自行創建這個實例
- 必須自行向整個系統提供這個實例
php中使用單例模式的原因
<?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;
}
}
}
缺陷:
每次應該直接返回當前應用中已經打開的數據庫連接句柄
- //單例模式返回數據庫連接句柄
- $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類從而失去單例模式意義
- 必須提供一個訪問這個實例的公共靜態方法,從而返回唯一實例的一個引用