標籤:辛星 單例 設計模式 php 模式
其實單例模式還是用的挺多的,要說到最經典的例子,可能就是操縱資料庫的類了,它如果是單例的話,可以避免大量的new操作消耗資源,而如果系統中需要一個類來管理全域的資訊,則把它用成單例也是很不錯的,因為它是全域有效,我們無需多次執行個體化。
下面是正確的調用方式樣本:
<?phpclass Xin{//儲存該類的執行個體private static $_instance;//不讓外部調用該建構函式private function __construct(){echo "辛星加油";} //用於擷取執行個體,必須是靜態,否則外部無法調用public static function get_instance(){//如果該單例不存在,則建立它if(!(self::$_instance instanceof self)){self::$_instance = new self;}//返回它既可return self::$_instance;}//不允許對象被複製public function __clone(){trigger_error('Clone Denyed!',E_USER_ERROR);}//功能函數public function xin(){echo "調用Xin類的xin函數,辛星你好";}}//正確的調用方式$xin = Xin::get_instance();$xin->xin();
它的輸出,我想讀者也能猜到了:
辛星加油調用Xin類的xin函數,辛星你好
如果我們要複製對象的話,比如下面代碼:
<?phpclass Xin{//儲存該類的執行個體private static $_instance;//不讓外部調用該建構函式private function __construct(){echo "辛星加油";} //用於擷取執行個體,必須是靜態,否則外部無法調用public static function get_instance(){//如果該單例不存在,則建立它if(!(self::$_instance instanceof self)){self::$_instance = new self;}//返回它既可return self::$_instance;}//不允許對象被複製public function __clone(){trigger_error('Clone Denyed!',E_USER_ERROR);}//功能函數public function xin(){echo "調用Xin類的xin函數,辛星你好";}}//複製的時候會報錯的$xin = Xin::get_instance();$qian = clone $xin;
那麼會報錯資訊如下:
辛星加油( ! ) Fatal error: Clone Denyed! in D:\MyApp\wamp\www\err.php on line 22Call Stack
好啦,,鑒於單例模式本身就簡單,讀者有什麼不清楚的可以在下面留言,我會認真解答的。