靜態(tài)方式
關(guān)于全局變量的問題,甚至隱藏在getInstance()中的全局變量中也存在。因為全局變量在腳本的任何地方都有效,在沒有注意到的情況下,你依然有可能破壞這個全局變量,
在getInstance()方法內(nèi)部使用靜態(tài)變量來存儲Singleton是一個顯得干凈的辦法。第一個代碼片斷如下:
class DbConn { // ... function &getInstance() { static $instance = false; if (!$instance) $instance =& new DbConn(M_E); return $instance; } }
Zend 1引擎在PHP4中不能存儲靜態(tài)變量的引用 (請看http://www.php.net/manual/en/language.variables.scope.php#AEN3609)。使用一個工作區(qū)存儲靜態(tài)數(shù)組,并且將這個單件實例的引用放置到一個已知的數(shù)組中。getInstance()方法如下:
class DbConn { function DbConn($fromGetInstance=false) { if (M_E != $fromGetInstance) { trigger_error(‘The DbConn class is a Singleton,’ .’ please do not instantiate directly.’); } } function &getInstance() { static $instance = array(); if (!$instance) $instance0 =& new DbConn(M_E); return $instance0; } }
這段代碼很簡單的選擇了這個靜態(tài)數(shù)組$instancede的第一個元素,用來保持單件DbConns實例的引用。
雖然這段代碼有點依賴PHP的布爾方式,但它比那個全局版本更嚴(yán)謹(jǐn):在條件檢測時,使用一個空的數(shù)組會得到結(jié)果false。就像在DbConn類的前一個版本一樣,在函數(shù)的定義和賦值部分需要引用操作符。
PHP5中的單件模式
PHP5中更容易實現(xiàn)單件模式,PHP5對于類內(nèi)部變量和函數(shù)的訪問控制被加強了。將DbConn::_construct()構(gòu)造方法設(shè)置為私有(private),這個類就不能被直接實例化。用UML圖表示,PHP5的DbConn單件模式如下:
組合使用靜態(tài)方法和靜態(tài)變量保持這個實例,并且設(shè)置構(gòu)造函數(shù)為私有,以防止直接實例化類而創(chuàng)建實例,代碼如下:
class DbConn { /** * static property to hold singleton instance */ static $instance = false; /** * constructor * private so only getInstance() method can instantiate * @return void */ private function __construct() {} /** * factory method to return the singleton instance * @return DbConn */ public function getInstance() { if (!DbConn::$instance) { DbConn::$instance = new DbConn; } return DbConn::$instance; } }
本文鏈接:http://www.95time.cn/tech/program/2008/5904.asp
出處:phpchina
責(zé)任編輯:bluehearts
上一頁 php設(shè)計模式介紹之單件模式 [2] 下一頁
◎進入論壇網(wǎng)絡(luò)編程版塊參加討論
|