-1

おはようございます、

私は自分のコードに対してコード盲目であるように見えるので、数週間前に書かれたコードについて、もう少し目とアドバイスを求めたいと思います。

コード(短縮)

class TrackingCostCollection {
  private $available=0;
  private $ordered=0;
  private $differenceNumKits=0;

  public function fill ($row) {
    ...
  }

  /**
  * @var TrackingCostCollection $collection
  */
  public function merge ($collection) {

    $this->available += $collection->available;
    $this->ordered += $collection->ordered;
    $this->differenceNumKits= $this->available-$this->ordered;
  }
}

問題

データ フィールドの 1 つを使用してデータを反復およびグループ化すると、2 つの異なる配列内に格納された 2 つの異なるクラス インスタンスに同じデータが含まれるという問題が発生しますが、理由はわかりません。追加の「クローン」を使用するとすぐに問題はなくなりますが、コードがそのように動作する理由を知りたいです。

foreach ($arrValues as $row) {
  ...
  $this->calculateStatistics($row);

}


private function calculateStatistics ($row) {
  $fieldValue= $row['country'];
  $collection = new TrackingCostCollection();
  $collection->fill($row);

  if (!isset($this->arrStatistics[$fieldValue])) {
    $this->arrStatistics[$fieldValue] = $collection2;
  } else {
    /* @var TrackingCostCollection $previousCollection2 */
    $previousCollection = $this->arrStatistics[$fieldValue];
    $previousCollection->merge($collection2);
    $this->arrStatistics[$fieldValue] = $previousCollection;
    unset($previousCollection);
  }

  // using $collection instead of $collection2 will cause 
  // two array entries containing the same data

  $collection2= clone $collection;
  if (!isset($this->arrTotals[$fieldValue])) {
    $this->arrTotals[$fieldValue] = $collection2;
  } else {
    /* @var TrackingCostCollection $previousCollection2 */
    $previousCollection = $this->arrTotals[$fieldValue];
    $previousCollection->merge($collection2);
    $this->arrTotals[$fieldValue] = $previousCollection;
    unset($previousCollection);
  }
}

問題の原因を診断するためにさらにコードが必要な場合は、お知らせください。さらに追加します。

お時間をいただきありがとうございます。

4

1 に答える 1