PHP デザイン パターンの概要: 値オブジェクト パターン ページ 1/5_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:52:49
オリジナル
1076 人が閲覧しました


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

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

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

// PHP5
class BadDollar {
protected $amount;
public function __construct($amount=0) {
$this->amount = (float)$amount;
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->wallet = $job->payDay(); ;assertEqual(200, $p1->wallet->getAmount());
$p2->wallet = $job->payDay();
$this->assertEqual(200, $p2-> ;wallet->getAmount());
$p1->wallet->add($job->payDay());
$this->assertEqual(400, $p1->gt;wallet-> ;getAmount());
//これは本当に悪いです - 実際は 400
$this->assertEqual(200, $p2->wallet->getAmount());
$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 異なるため、等しい期待は失敗します
testBadDollarWorking 内
ValueObjTestCase 内
2) [Integer: 200] が [Float と異なるため、等しい期待は失敗します] : 400] by 200
testBadDollarWorking
ValueObjTestCase
FAILURES




http://www.bkjia.com/PHPjc/318876.html

www.bkjia.com

tru​​e

技術記事たとえば、オブジェクトは通常、日付、数値、または通貨を記述するために使用されます。日付、整数、またはドルのクラス定義は、使いやすく、高速で、カプセル化し、入力も簡単です...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート