《PHP設(shè)計(jì)模式介紹》第二章 值對(duì)象模式_PHP教程
推薦:《PHP設(shè)計(jì)模式介紹》第一章 編程慣用法學(xué)習(xí)一門新的語言意味著要采用新的慣用法。這章將介紹或者可能重新強(qiáng)調(diào)一些慣用法。你會(huì)發(fā)現(xiàn)這些慣用法在你要在代碼中實(shí)現(xiàn)設(shè)計(jì)模式時(shí)候是非常有用的。 在這里總結(jié)的許多編程慣用法都是很值得
在所有的最簡單的程序中,大多數(shù)對(duì)象都有一個(gè)標(biāo)識(shí),一個(gè)重要的商業(yè)應(yīng)用對(duì)象,例如一個(gè)Customer或者一個(gè)SKU,有一個(gè)或者更多的屬性---id,name,email地址,這樣可以把它從同一個(gè)類的其他實(shí)例區(qū)分開來。此外,對(duì)象有一個(gè)恒定的標(biāo)識(shí):它是貫穿于整個(gè)應(yīng)用程序的一個(gè)唯一的標(biāo)識(shí),對(duì)于程序員來說,”customer A”在任何地方就是”customer A”,并且只要你的程序在持續(xù)運(yùn)行時(shí)"customer A"仍然是"customer A"。 但是一個(gè)對(duì)象不需要有一個(gè)標(biāo)識(shí)。有些對(duì)象僅僅是為了描述其他對(duì)象的屬性。
例如:通常用一個(gè)對(duì)象描述一個(gè)日期、一個(gè)數(shù)字或者貨幣。日期、整數(shù)或美元的類定義是都是便于使用的、快捷、便于封裝的,并且方便進(jìn)行拷貝,相互比較,甚至是創(chuàng)建。
從表面上看,這些描述簡單的對(duì)象很容易被執(zhí)行:它們的語句非常少,在構(gòu)造類時(shí)無論是應(yīng)用于Customer還是SKU都沒有什么不同。這個(gè)想法似乎是正確的,但是所謂的"似乎正確"很容易產(chǎn)生一些bug。
請(qǐng)看下面的代碼,這是一個(gè)關(guān)于以美元給員工發(fā)放工資的對(duì)象的定義和執(zhí)行操作。多數(shù)情況下,它的運(yùn)行是沒有問題的。(這個(gè)類被命名為BadDollar,因?yàn)樗存在著bug)�?紤]一下,看你是否能發(fā)現(xiàn)它的bug。
|
// PHP5 class Work { function testBadDollarWorking() { |
那么, bug是什么呢?如果不能上面的代碼例子中直觀地發(fā)現(xiàn)問題,這里有個(gè)提示:雇員對(duì)象$p1和對(duì)象$p2使用著同一個(gè)BadDollar對(duì)象實(shí)例。
首先,類Work和類Person的實(shí)例已經(jīng)創(chuàng)建。那么,假設(shè)每一個(gè)雇員最初有一個(gè)空的電子錢包,雇員的電子錢包Person:wallet是通過Work::payDay()函數(shù)返回的對(duì)象資源變量賦值的,所以被設(shè)定為一個(gè)BadDollar類的對(duì)象實(shí)例。
還記得PHP5的對(duì)象賦值處理方式嗎?因?yàn)镻HP5的對(duì)象賦值的處理方式,所以$job::salary,、$p1::wallet和$p2::wallet這三個(gè)看上去不同的對(duì)象實(shí)例雖然使用著不同的“標(biāo)識(shí)符”,但是事實(shí)上,它們?nèi)慷贾付ǖ酵粋(gè)對(duì)象實(shí)例。
因此,接下來的發(fā)放工資的操作(PayDay表示發(fā)放工資的日子,這里表示發(fā)放工資的動(dòng)作),使用$job->payDay()本來僅僅是想增加$P1的工資,卻出乎意料地次給$P2也發(fā)放了。并且,這個(gè)動(dòng)作還改變了工作的基本工資的額度。因此,最后兩個(gè)值的檢測報(bào)錯(cuò)。
| Value Object PHP5 Unit Test 1) Equal expectation fails because [Integer: 200] differs from [Float: 400] by 200 in testBadDollarWorking in ValueObjTestCase 2) Equal expectation fails because [Integer: 200] differs from [Float: 400] by 200 in testBadDollarWorking in ValueObjTestCase FAILURES!!! |
分享:《PHP設(shè)計(jì)模式介紹》導(dǎo)言當(dāng)你在不斷的試圖從你的應(yīng)用程序中發(fā)現(xiàn)新的特征時(shí),你是否發(fā)現(xiàn)你提出的解決方法和一些以前你已經(jīng)實(shí)現(xiàn)的東西是如此的類似呢?如果你是一個(gè)程序員(即使你才 開始很短的時(shí)間),你都可能回答&ldqu
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
PHP教程Rss訂閱編程教程搜索
PHP教程推薦
- php仿QQ驗(yàn)證碼的實(shí)例分析
- 解決FastCGI 進(jìn)程超過了配置的活動(dòng)超時(shí)時(shí)限的問題
- 你或許尚未了解PHP的那10件事情
- 詳解PHP內(nèi)置訪問資源的超時(shí)時(shí)間 time_out file_get_contents read_file
- 做了CDN獲取用戶真實(shí)IP的函數(shù)代碼(PHP與Asp設(shè)置方式)
- 解決PHP無法訪問遠(yuǎn)程mysql的問題
- 用什么軟件打開php文件
- PHP技巧:PHP腳本中關(guān)于拼寫檢查函數(shù)庫
- 解析PHP編寫的25個(gè)游戲腳本
- PHP命名空間(Namespace)的使用詳解
- 相關(guān)鏈接:
- 教程說明:
PHP教程-《PHP設(shè)計(jì)模式介紹》第二章 值對(duì)象模式
。