設計模式只是為 Java? 架構師準備的 —— 至少您可能一直這樣認為。實際上,設計模式對於每個人都非常有用。如果這些工具不是 “架構太空人” 的專利,那麼它們又是什嗎?為什麼說它們在 PHP 應用程式中非常有用。
今天我們一起來學習單例模式:
學一個模式,我們總要知道應用的情境吧。不然,就好比學一門武功招式,若不知道在何種情況下使用,豈不是枉費功夫呀。
對於單例模式,最常見的一個應用就是資料庫連接。如果每開啟一個網頁,就建一個連結,那這種銷耗是很大的一個浪費。所以我們需要用單例模式來確保系統只有在必要的時候才建立新串連。
如果用虛擬碼來描述單例模式,可以這樣寫:
if(串連存在){
返回該連結
}else{
建立一個新連結
}
但是這樣實現顯然是有問題的,這個連結要怎麼儲存,才可以被外部存取,同時又可以不被外部破壞。這個如果是用php來實現的話,是很容易的。我們一起來看一段代碼:
//get data class class DB { private $_db; private static $_instance; private function __construct(){ $DSN = '../../content/xxtebook.db'; $this->_db = new PDO('sqlite:'.$DSN); } //初始化資料庫連接 public static function initDB(){ if(! (self::$_instance instanceof self)){ self::$_instance = new self(); } return self::$_instance; } //其它方法 }
為什麼要把建構函式進行私人化呢?這個問題問的很好,歡迎大家提出這樣的疑問哈。
首先,做為單例,就是要避免被外部意外的建立新的執行個體。通過內部的方法進行執行個體的建立工作,可以確保這一點。而且內部方法訪問內部的變數,具有先天性的優勢。
其實我們可以把執行個體的結時儲存在類的內部,這樣下次在檢到這個值的存在時,可以直接取出使用,而不需要再重新建立。
當然,我看到有些書上,做了一個空的 __clone(){}方法,防止複製,這是很好的。錦上添花的事情,我就留到具體的項目上去做了。
最後我們來看看怎麼用這個單例:
$db = DB::initDB(); //$db->somMethod();
是不是非常的簡單呢。
另外對於哪些方法用靜態,哪些方法不用,我的想法就是,如果方法內部要訪問$this變數的,那麼就不應當用靜態方法,反之則可以用靜態。也就是說,靜態方法不需要通過例實對象就可以使用。
下一次我們再一起學習原廠模式
以上就介紹了學習設計模式,包括了設計模式(1)方面的內容,希望對PHP教程有興趣的朋友有所協助。