《PHP設(shè)計(jì)模式介紹》第四章 單件模式(2)_PHP教程
推薦:《PHP設(shè)計(jì)模式介紹》第三章 工廠模式在面向?qū)ο缶幊讨? 最通常的方法是一個(gè)new操作符產(chǎn)生一個(gè)對(duì)象實(shí)例,new操作符就是用來(lái)構(gòu)造對(duì)象實(shí)例的。但是在一些情況下, new操作符直接生成對(duì)象會(huì)帶來(lái)一些問(wèn)題。舉例來(lái)說(shuō), 許多類型對(duì)象的創(chuàng)造需
下面有個(gè)例子,它解釋了為什么構(gòu)造函數(shù)保護(hù)代碼有一個(gè)全局的標(biāo)識(shí):
|
class DbConn { |
PHP4允許你改變構(gòu)造函數(shù)中$this的值。在過(guò)去,我們會(huì)習(xí)慣設(shè)置 $this = null;當(dāng)有一個(gè)創(chuàng)建構(gòu)造錯(cuò)誤時(shí),確保無(wú)效的對(duì)象不能被代碼繼續(xù)使用。PHP4中很有用的東西,在PHP5中并不兼容,將來(lái)會(huì)在你的代碼中得到驗(yàn)證,這種技術(shù)不再被推薦。
這段代碼中另外一個(gè)重點(diǎn)是引用操作&的用法。有兩種地方需要使用&。第一種是在函數(shù)定義時(shí),在函數(shù)名字前用來(lái)表示將返回一個(gè)引用。第二種是將新的DbConn對(duì)象賦值給$GLOBALS數(shù)組。(在序言和值對(duì)象章節(jié)中提到過(guò):在PHP4中,你總會(huì)使用&操作符,以引用的方式創(chuàng)建、傳遞和返回對(duì)象,)
getInstance()方法的條件檢查,常常被寫成沒(méi)有警示的情況下運(yùn)行,甚至在E_ALL的錯(cuò)誤級(jí)別下也不會(huì)提示。它檢查在$GLOBAL數(shù)組中適當(dāng)?shù)奈恢檬欠裼幸粋(gè)DbConn對(duì)象,如果沒(méi)有,就在那里創(chuàng)建這個(gè)對(duì)象。這個(gè)方法于是返回了這樣的結(jié)果,這個(gè)對(duì)象能被重復(fù)創(chuàng)建或者這個(gè)對(duì)象在之前已經(jīng)被這個(gè)方法創(chuàng)建過(guò)了。當(dāng)方法結(jié)束時(shí),你可以確認(rèn)已經(jīng)擁有這個(gè)類的有效實(shí)例,而且它已經(jīng)被有效初始化。
靜態(tài)方式
關(guān)于全局變量的問(wèn)題,甚至隱藏在getInstance()中的全局變量中也存在。因?yàn)槿肿兞吭谀_本的任何地方都有效,在沒(méi)有注意到的情況下,你依然有可能破壞這個(gè)全局變量,
在getInstance()方法內(nèi)部使用靜態(tài)變量來(lái)存儲(chǔ)Singleton是一個(gè)顯得干凈的辦法。第一個(gè)代碼片斷如下:
| class DbConn { // ... function &getInstance() { static $instance = false; if (!$instance) $instance =& new DbConn(M_E); return $instance; } } |
| 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; } } |
雖然這段代碼有點(diǎn)依賴PHP的布爾方式,但它比那個(gè)全局版本更嚴(yán)謹(jǐn):在條件檢測(cè)時(shí),使用一個(gè)空的數(shù)組會(huì)得到結(jié)果false。就像在DbConn類的前一個(gè)版本一樣,在函數(shù)的定義和賦值部分需要引用操作符。
分享:《PHP設(shè)計(jì)模式介紹》第二章 值對(duì)象模式在所有的最簡(jiǎn)單的程序中,大多數(shù)對(duì)象都有一個(gè)標(biāo)識(shí),一個(gè)重要的商業(yè)應(yīng)用對(duì)象,例如一個(gè)Customer或者一個(gè)SKU,有一個(gè)或者更多的屬性---id,name,email地址,這樣可以把它從同一個(gè)類的其他實(shí)例區(qū)分開
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁(yè)面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問(wèn)控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語(yǔ)言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國(guó)語(yǔ)言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
PHP教程Rss訂閱編程教程搜索
PHP教程推薦
- php實(shí)現(xiàn)單鏈表的實(shí)例代碼
- 關(guān)于二級(jí)目錄拖拽排序的實(shí)現(xiàn)(源碼示例下載)
- 讓你的PHP引擎全速運(yùn)轉(zhuǎn)的三個(gè)簡(jiǎn)單絕招
- setcookie中Cannot modify header information-headers already sent by錯(cuò)誤的解決方法詳解
- PHP數(shù)據(jù)庫(kù)備份類
- PHP技巧:優(yōu)化動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)PHP程序的12條技巧
- ajax完美實(shí)現(xiàn)兩個(gè)網(wǎng)頁(yè) 分頁(yè)功能的實(shí)例代碼
- php實(shí)現(xiàn)gb2312和unicode間編碼轉(zhuǎn)換
- php自動(dòng)識(shí)別文字字符串編碼并轉(zhuǎn)為目標(biāo)編碼
- 創(chuàng)建XML Http Request對(duì)象兩個(gè)的方法
- 相關(guān)鏈接:
- 教程說(shuō)明:
PHP教程-《PHP設(shè)計(jì)模式介紹》第四章 單件模式(2)
。