/1**
* 設計模式之單例模式
* $_instance必須聲明為靜态的私有變量
* 構造函數和析構函數必須聲明為私有,防止外部程式new
* 類進而失去單例模式的意義
* getInstance()方法必須設定為公有的,必須調用此方法
* 以傳回執行個體的一個引用
* ::操作符隻能通路靜态變量和靜态函數
* new對象都會消耗記憶體
* 使用場景:最常用的地方是資料庫連接配接。
* 使用單例模式生成一個對象後,
* 該對象可以被其它衆多對象所使用。
*/
class Danli {
//儲存類執行個體的靜态成員變量
private static $_instance;
//private标記的構造方法
private function __construct(){
echo 'This is a Constructed method;';
}
//建立__clone方法防止對象被複制克隆
public function __clone(){
trigger_error('Clone is not allow!',E_USER_ERROR);
}
//單例方法,用于通路執行個體的公共的靜态方法
public static function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance = new self;
}
return self::$_instance;
}
public function test(){
echo '調用方法成功';
}
}
//用new執行個體化private标記構造函數的類會報錯
//$danli = new Danli();
//正确方法,用雙冒号::操作符通路靜态方法擷取執行個體
$danli = Danli::getInstance();
$danli->test();
//複制(克隆)對象将導緻一個E_USER_ERROR
$danli_clone = clone $danli;