什麼是單例模式?
在整個應用中透過這個類別只能實例化一個物件實例的設計模式
模式分類?
在所有模式設計中,有三種基礎設計模式,單例模式,工廠模式,註冊樹模式,其他模式往往基於這幾種模式,今天帶來的是單例模式。
為什麼要用單例模式?
1。 php常常和資料庫打交道,如果在應用程式中經常建立連接對象,進行new操作的話,會消耗大量的系統記憶體資源。 (節省資源開銷)
2。在團隊合作專案中,單例模式可以有效避免不同程式設計師new自己的物件時,造成人為的系統消耗。 (節省資源開銷)
------------------實現單例3部曲+1曲------------------
第一步:封裝構造方法 private __construct( ) { }
原因: 方法創建實例物件了。
第二步: 透過類別內的方法建立物件實例。 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 错误行号 ?>