例: オブジェクトは通常、日付、数値、または通貨を記述するために使用されます。日付、整数、またはドルのクラス定義は、使いやすく、高速で、カプセル化が簡単で、コピー、相互比較、さらには作成も簡単です。
表面的には、単純な説明を持つこれらのオブジェクトは実行が簡単です。これらのオブジェクトにはステートメントがほとんどなく、クラスの構築時に Customer に適用されるか SKU に適用されるかに違いはありません。この考えは正しいように思えますが、いわゆる「正しいように見える」という考えは、簡単にいくつかのバグを生み出す可能性があります。
以下のコードをご覧ください。これは、従業員に米ドルで賃金を支払うオブジェクトの定義と実行です。ほとんどの場合、問題なく動作します。 (このクラスにはバグがあったため、BadDollar という名前が付けられました)。それについて考えて、バグが見つかるかどうかを確認してください。
// PHP5
class BadDollar {
protected $amount;
public function __construct($amount=0) {
$this->amount = (float)$amount
}
public function 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(); assertEqual(200, $p1->wallet->getAmount());
$p2->wallet = $job->payDay();
$this->assertEqual(200, $p2->ウォレット->getAmount());
$p1->ウォレット->add($job->payDay());
$this->assertEqual(400, $p1->ウォレット-> 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] と異なるため、等しい期待値は失敗します。 400] by 200
テストBadDollarWorking
ValueObjTestCase
FAILURES
現在のページ 1/5 12345次のページ
上記は、デザイナー履歴書テンプレートの内容を含む、PHP デザイン パターン紹介値オブジェクト パターンのページ 1/5 を紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。