標籤:his 串連數 靜態成員 控制代碼 串連 特定 static 建立 相關
一、什麼是單例模式?
1、含義
作為對象的建立模式,單例模式確保某一個類只有一個執行個體,而且自行執行個體化並向整個系統全域地提供這個執行個體。它不會建立執行個體副本,而是會向單例類內部儲存的執行個體返回一個引用。
2、單例模式的三個要點:
(1)需要一個儲存類的唯一執行個體的靜態成員變數:
private static $obj;
(2)建構函式和複製函數必須聲明為私人的,防止外部程式new類從而失去單例模式的意義:
private function __construct()
{
}
private function __clone()
{
}//覆蓋__clone()方法,禁止複製 關於clone 和 __clone 魔術方法將會在本部落格說明
(3)必須提供一個訪問這個執行個體的公用的靜態方法(通常為getInstance方法),從而返回唯一執行個體的一個引用
public static function getInstance()
{
if(!self::$obj)
{
self::$obj= new self();
}
return self::$_instance;
} 關於self 和 $this 不理解的同學請看這裡。
http://www.cnblogs.com/moxiaoan/p/6228905.html
關於靜態變數與靜態方法不理解的可以看這裡。
http://www.cnblogs.com/moxiaoan/p/6228948.html
二、為什麼要使用單例模式?
1、PHP缺點:
PHP語言是一種解釋型的指令碼語言,這種運行機制使得每個PHP頁面被解釋執行後,所有的相關資源都會被回收。也就是說,PHP在語言層級上沒有辦法讓某個對象常駐記憶體,這和asp.net、Java等編譯型是不同的,比如在Java中單例會一直存在於整個應用程式的生命週期裡,變數是跨頁面級的,真正可以做到這個執行個體在應用程式生命週期中的唯一性。然而在PHP中,所有的變數無論是全域變數還是類的靜態成員,都是頁面級的,每次頁面被執行時,都會重建立立新的對象,都會在頁面執行完畢後被清空,這樣似乎PHP單例模式就沒有什麼意義了,所以PHP單例模式我覺得只是針對單次頁面級請求時出現多個應用情境並需要共用同一對象資源時是非常有意義的。
2、單例模式在PHP中的應用場合:
(1)應用程式與資料庫互動
一個應用中會存在大量的資料庫操作,比如過資料庫控制代碼來串連資料庫這一行為,使用單例模式可以避免大量的new操作,因為每一次new操作都會消耗記憶體資源和系統資源。
(2)控制配置資訊
如果系統中需要有一個類來全域控制某些配置資訊, 那麼使用單例模式可以很方便的實現.
三、如何?單例模式?
1、普通的資料庫訪問例子:
//初始化一個資料庫控制代碼
$db = new DB(...);
//添加使用者資訊
$db->addUserInfo(...);
......
//在函數中訪問資料庫,尋找使用者資訊
function getUserInfo()
{
$db = new DB(...);//再次new 資料庫類,和資料庫建立串連
$db = query(....);//根據查詢語句訪問資料庫
}
?>
2、應用單例模式對資料庫進行操作:
class DB
{
private static $obj;
private function __construct(...)
{
}
private function __clone() {};
public static function getInstance()
{
if(! (self::$obj instanceof self) ) { // instanceof使用這個關鍵字可以確定一個對象是類的執行個體、類的子類,還是實現了某個特定介面.
self::$obj = new self();
}
return self::$obj;
}
public function addUserInfo(...)
{
}
public function getUserInfo(...)
{
}
}
//test
$db = DB::getInstance();
$db->addUserInfo(...);
$db->getUserInfo(...);
?>
PHP單例模式