定義:簡單的說,整個應用中只有一個例項物件的設計模式。
1、單例模式的要點:
- 建構函式需要標記為private(訪問控制:防止外部程式碼使用new操作符建立物件),單例類不能在其他類中例項化,只能被其自身例項化;
- 擁有一個儲存類的例項的靜態成員變數
- 擁有一個訪問這個例項的公共的靜態方法(常用getInstance()方法進行例項化單例類,通過instanceof操作符可以檢測到類是否已經被例項化)
簡單的記為三私一公一關鍵:
- 公共靜態方法(public static function getInstance()),用來訪問靜態屬性儲存的物件,如果沒有物件,則生成此單例
- 私有靜態屬性(privite static $instance),又來儲存生成的唯一物件
- 私有建構函式 (privite __contruct()),構造方法私有化,防止外部建立例項
- 私有克隆函式(privite function __clone()),防止克隆——clone
- 關鍵詞instanceof,檢查此變數是否為該類的物件、子類、或是實現介面。
2、為什麼要使用PHP單例模式?
- php的應用主要在於資料庫應用, 所以一個應用中會存在大量的資料庫操作,** 使用單例模式, 則可以避免大量的new 操作消耗的資源。**
- 如果系統中需要有一個類來全域性控制某些配置資訊, 那麼使用單例模式可以很方便的實現。
class Singleton{ //私有屬性,用於儲存例項 private static $instance; //構造方法私有化,防止外部建立例項 private function __construct(){} //公有屬性,用於測試 public $a; //公有方法,用於獲取例項 public static function getInstance(){ //判斷例項有無建立,沒有的話建立例項並返回,有的話直接返回 if(!(self::$instance instanceof self)){ self::$instance = new self(); } return self::$instance; } //克隆方法私有化,防止複製例項 private function __clone(){} }
測試:
首先建立兩個例項:
`$first = Singleton::getInstance();`
`$second = Singleton::getInstance();`
給第一個例項中的$a屬性賦值,並列印兩個例項
$first->a = "zs";
echo "<pre>";
print_r($first);
print_r($second);
列印結果為:
給第二個賦值,並列印:
$first->a = "zs";
$second->a = "ls";
echo "<pre>";
print_r($first);
print_r($second);
本作品採用《CC 協議》,轉載必須註明作者和本文連結