單例模式:即一個類只被實例化一次,當其他人對其再次實例化時,便返回第一次實例化的對象。這種模式可以極大地節約資源。典型應用於數據庫類的實例化。
以實例化一個Mysql數據庫類為例:
要實現一個類只實例化一次,就必須堵住其他實例化的入口。
1.實例化類時,會自動調用類的構造方法,因為將構造方法設置為private屬性,限制為只能在類內部實例化
private function __construct(){
}
2.定義一個靜態方法,在類內部實例化對象。實例化前先判斷該類是否已被實例化了,若已被實例化,就返回該實例化對象;若沒被實例化,便實例化一個對象並將該對象保存在類的靜態屬性中
private static $self = null;
public static function create(){
if (self::$self === null) {
self::$self = new self();
}
return self::$self;
}
3.禁止克隆,對象之間進行克隆可生成不同的對象。而克隆時會自動調用類的__conle方法,因此將克隆方法設置為private屬性
private function __clone(){
}
綜上,三私一公(三個私有屬性和一個公共方法)單例模式的代碼如下:
class Mysql {
private static $self = null;
public static function create(){
if (self::$self === null) {
self::$self = new self();
}
return self::$self;
}
private function __construct(){
}
private function __clone(){
}
}
$a = Mysql::create();
$b = Mysql::create();
/*判斷兩個類是否為同一個類*/
echo $a===$b ? 1 : 0;