ホームページ >php教程 >php手册 >PHP デザイン パターンの概要: 値オブジェクト パターン ページ 1/5

PHP デザイン パターンの概要: 値オブジェクト パターン ページ 1/5

WBOY
WBOYオリジナル
2016-06-13 12:29:271201ブラウズ


例: オブジェクトは通常、日付、数値、または通貨を記述するために使用されます。日付、整数、またはドルのクラス定義は、使いやすく、高速で、カプセル化が簡単で、コピー、相互比較、さらには作成も簡単です。

表面的には、これらの単純な説明オブジェクトは実行が簡単です。これらのオブジェクトにはステートメントがほとんどなく、クラスの構築時に Customer に適用されるか SKU に適用されるかに違いはありません。この考えは正しいように思えますが、いわゆる「正しいように見える」という考えは、簡単にいくつかのバグを生み出す可能性があります。

次のコードを見てください。これは、従業員に米ドルで賃金を支払うオブジェクトの定義と実行操作です。ほとんどの場合、問題なく動作します。 (このクラスにはバグがあったため、BadDollar という名前が付けられました)。それについて考えて、バグが見つかるかどうかを確認してください。

// PHP5
class BadDollar {
protected $amount;
public function __construct($amount=0) {
$this->amount = (float)$amount ;
}
パブリック関数 getAmount() {
return $this->amount;
}
public function add($dollar) {
$this->amount = $dollar->getAmount();
}
}
class Work {
protected $salary;public function __construct() {
$this->salary = new BadDollar(200) );}
public function payDay() {
return $this->salary;
}
class Person {
public $wallet
} 関数 testBadDollarWorking() {
$job = 新しい仕事;
$p2 = 新しい人
$p1->payDay( );
$this->assertEqual(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());
//これは悪いです — 実際には 400
$this->assertEqual(200, $p2-> ;wallet->getAmount());
//これは本当に悪いです — 実際には 400
$this->assertEqual(200, $job->payDay()->getAmount());
}
それでは、バグとは何でしょうか?上記のコード例で問題が視覚的にわからない場合は、次のヒントを参照してください。従業員オブジェクト $p1 とオブジェクト $p2 は、同じ BadDollar オブジェクト インスタンスを使用します。

まず、Work クラスと person クラスのインスタンスが作成されました。次に、各従業員が最初に空の電子ウォレットを持っていると仮定すると、従業員の電子ウォレット person:wallet は、Work::payDay() 関数によって返されるオブジェクト リソース変数を通じて割り当てられるため、BadDollar クラスのオブジェクト インスタンスに設定されます。 。

PHP5 のオブジェクト割り当てメソッドを覚えていますか? PHP5 でのオブジェクト割り当ての処理方法により、3 つの異なるオブジェクト インスタンス $job::salary、$p1::wallet、$p2::wallet は異なる「識別子」を使用しているように見えますが、実際には、それらはすべて同じオブジェクトインスタンス。

したがって、次の給与支払い操作 (PayDay は賃金が支払われる日を表し、ここでは賃金を支払うアクションを表します) では、$job->payDay() を使用して、本来は給与を増やしたいだけでした。 $P1 ですが、意外にも $P2 も初めて配布されました。さらに、このアクションにより、その仕事の基本給の額も変更されます。したがって、最後の 2 つの値の検出はエラーを報告します。

Value オブジェクト PHP5 単体テスト
1) [Integer: 200] と [Float: 400] が 200 異なるため、等しい期待は失敗します
in testBadDollarWorking
in ValueObjTestCase
2) 等しい[Integer: 200] が [Float: 400] と 200 異なるため、期待は失敗します。
in testBadDollarWorking
in ValueObjTestCase
FAILURES!!!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。