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