【发布时间】:2016-12-12 22:22:58
【问题描述】:
我遇到了同样的问题about making a copy of an object without reference in PHP,但该解决方案不起作用。
我想获取集合的所有元素,更改一个属性(添加月份)并将新元素推送到新集合中。
所以我使用clone 来获得Invoice 的全新实例,它应该只受到那个实例的影响,但不是。
使用此代码:
while($thisInvoiceYear <= CURRENT_YEAR) {
$clonedInvoice = clone($thisInvoice);
$this->extendedInvoices->push($clonedInvoice);
$toSaveInvoice = $this->extendedInvoices->last();
$thisInvoiceYear = $this->getCurrentYear($toSaveInvoice);
$toSaveInvoice->Schedule->StartDate = Carbon::parse($toSaveInvoice->Schedule->StartDate)->addMonths($period);
unset($clonedInvoice);
}
$thisInvoice 是 Invoice 集合的对象,$this->extendedInvoices 是 Invoice 类的方法。
问题在于$toSaveInvoice 中所做的每一项更改都会影响到原始集合元素。经过 3 次迭代后,extendedInvoices 的所有元素的日期都相同,不应为:
我正在使用 Laravel 5.2,但我认为没有帮助器来克隆集合的元素。
你知道为什么clone() 不起作用吗?非常感谢您的帮助。
【问题讨论】:
-
克隆很可能是在做“浅克隆”;您可能需要提供自定义魔术
__clone方法来执行“深度克隆”(即克隆 Invoice 对象中的所有嵌套对象)
标签: php clone pass-by-reference