例如:通常用一個物件描述一個日期、一個數字或貨幣。日期、整數或美元的類別定義是都是便於使用的、快速、方便封裝的,並且方便進行拷貝,相互比較,甚至是創建。
從表面上看,這些描述簡單的物件很容易被執行:它們的語句非常少,在建構類別時無論是應用於Customer或SKU都沒有什麼不同。這個想法似乎是正確的,但是所謂的"似乎正確"很容易產生一些bug。
請看下面的程式碼,這是一個關於以美元給員工發放薪水的物件的定義和執行操作。多數情況下,它的運作是沒有問題的。 (這個類別被命名為BadDollar,因為它還存在著bug)。考慮一下,看你是否能發現它的bug。
// PHP5
class BadDollar {
protected $amount;
public function __construct($amount=0) {
$this->amount __con($amount=0) {
$this->amount ); }
public function getAmount() {
return $this->amount;
}
public function add($dollar) { $this->amount +get> ();
}
}
class Work {
protected $salary;public function __construct() {
$this->salary =new BadD ); function payDay() {
return $this->salary;
}
}
class Person {
public $wallet;
} function >$job = new Work;
$p1 = new Person;
$p2 = new Person;
$p1->wallet = $job->payDay()
$p1->wallet = $job->payDay()
this; (200, $p1->wallet->getAmount());
$p2->wallet = $job->payDay();
$this->assertEqual(200, $p2->wallet-> getAmount());
$p1->wallet->add($job->payDay());
$this->assertEqual(400, $p1->wallet->getAmount());
//this is bad — actually 400
$this->assertEqual(200, $p2->wallet->getAmount());
// ->assertEqual(200, $job->payDay()->getAmount());
}
那麼, bug是什麼呢?如果不能上面的程式碼範例中直觀地發現問題,這裡有個提示:僱員物件$p1和物件$p2使用著同一個BadDollar物件實例。
首先,類別Work和類別Person的實例已經建立。那麼,假設每一個僱員最初有一個空的電子錢包,僱員的電子錢包Person:wallet是透過Work::payDay()函數傳回的物件資源變數賦值的,所以被設定為一個BadDollar類別的物件實例。
還記得PHP5的物件賦值處理方式嗎?因為PHP5的物件賦值的處理方式,所以$job::salary,、$p1::wallet和$p2::wallet這三個看上去不同的物件實例雖然使用著不同的“標識符”,但是事實上,它們全部都指定到同一個物件實例。
因此,接下來的發放薪水的操作(PayDay表示發放薪水的日子,這裡表示發放薪水的動作),使用$job->payDay()本來僅僅是想增加$P1的工資,卻出乎意料地次也發給$P2了。並且,這個動作也改變了工作的基本工資的額度。因此,最後兩個值的偵測報錯。
Value Object PHP5 Unit Test
1) Equal expectation fails because [Integer: 200] differs from [Float: 40test] 200] differs from [Float: 40test] TestCase
2) Equal expectation fails because [Integer: 200] differs from [Float: 400] by 200
in testBadDollarWorking
in ValueObjTestCase
FAILURES!!
以上就介紹了設計師求職履歷範本 php設計模式介紹之值物件模式第1/5頁,包含了設計師求職履歷範本方面的內容,希望對PHP教學有興趣的朋友有所幫助。