我似乎是codeblind爲我自己的代碼,所以我想問一些額外的眼睛和一些代碼的建議,如果寫幾周前。
守則(縮短)
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;
}
}
的問題
當迭代和由數據字段我遇到存儲內的兩個不同的兩個不同的類的實例的問題之一分組數據數組包含相同的數據,雖然我不明白爲什麼?當我使用一個額外的「克隆」的問題消失,但我想了解爲什麼我的代碼的行爲方式是這樣:
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);
}
}
如果更多的代碼是必要的診斷問題的原因只是讓我知道我會添加更多。
非常感謝您的時間!
,克隆返回$收集的副本,並將其分配給$ collection2 – demonking
默認對象由PHP參考定義。 – PeeHaa
使用__clone()回調來解決此問題;就像其他評論者提到的那樣 –