什麼是單例模式?
在整個應用中通過這個類只能實例化一個對象實例的設計模式
模式分類?
在所有模式設計中,有三種基礎設計模式,單例模式,工廠模式,注冊樹模式,其他模式往往基於這幾種模式,今天帶來的是單例模式。
為什麼要用單例模式?
1。php常常和數據庫打交道,如果在應用中頻繁建立連接對象,進行new操作的話,會消耗大量的系統內存資源。(節省資源開銷)
2。在團隊合作項目中,單例模式可以有效避免不同程序員new自己的對象時,造成人為的系統消耗。(節省資源開銷)
------------------實現單例3部曲+1曲------------------
第一步:封裝構造方法 private __construct( ) { }
原因: 構造函數在 new 出對象的時候第一個調用的方法 構造函數被申明為private或者protected這注定無法通過new的方法創建實例對象了。
第二步: 通過類內的方法來創建對象實例。 static Single(){ }
原因:我們往往往往是創建了對象後才調用對象的方法,而此時需要調用類裡面的方法來創建對象。不受是否創建對象影響都能調用的方法的解決方案毋庸置疑那就是利用關鍵字--static
第三步:定義一個封裝的靜態變量 private static $instance
原因:把實例化的唯一對象放在這個變量裡面存起來
第四步(加1曲):私有化克隆的魔術方法:__c l o n e ();
原因:對於一個類的對象,如果使用“clone運算符”,就會克隆出一個跟當前對象完全一樣的新對象出來,並且:此時這個新對象還會自動調用該類中的魔術方法:_ _c l o n e ();只要其中有該方法;
代碼演示
<?php
class Sing {
//第三步:定義一個變量
private static $instance= null;
//第一步:封裝構造函數
private function __construct(){
}
//第二步:使用類名調用這個類創建對象實例
static function getSingle(){
if( !(self::$instance instanceof self) ){ //instanceof判斷一個對象是否是某個類的實例
self::$instance = new self(); //用變量來存儲實例化出來的對象
}
return self::$instance;
}
//第四步:禁止克隆實例化出來的對象
private function __clone(){ }
}
$danli = Sing::getSingle();
var_dump($danli); //輸出 object(Sing)#1 (0) { }
$danli2 = Sing::getSingle();
var_dump($danli2); //輸出 object(Sing)#1 (0) { }
$obj3 = clone $danli; //此處禁止克隆單例對象實例
var_dump($obj3); //Call to private Sing::__clone() from context '' in 錯誤行號
?>