おはようございます、
私は自分のコードに対してコード盲目であるように見えるので、数週間前に書かれたコードについて、もう少し目とアドバイスを求めたいと思います。
コード(短縮)
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);
}
}
問題の原因を診断するためにさらにコードが必要な場合は、お知らせください。さらに追加します。
お時間をいただきありがとうございます。