隨着this問題的參考,我得到了一個另一種解決方案是 使用__clone()vs unserialize(serialize())?
$obj2 = unserialize(serialize($obj1));
代替
$obj2 = clone $obj1;
哪一個是更好地使用?
隨着this問題的參考,我得到了一個另一種解決方案是 使用__clone()vs unserialize(serialize())?
$obj2 = unserialize(serialize($obj1));
代替
$obj2 = clone $obj1;
哪一個是更好地使用?
tl; dr版本:對簡單對象和樹使用clone
,對於複雜的對象圖使用unserialize(serialize())
。
更詳細的解釋:除非$obj1
工具__clone()
,表達clone $obj1
將返回淺拷貝的$obj1
,但共享對象的內容通過$obj1
指向。即使__clone()
被實現以通過成員的遞歸clone
來執行深度複製,如果對象圖是樹,它將只能安全地工作。如果對象圖包含循環,它將無限期地遞歸,並且......這是Stack Overflow的原因。 :-)如果它是一個有向非循環圖,但不是樹,多次引用的任何對象都會將這些多個引用替換爲副本,這可能不是您想要的。另一方面,將處理對象圖中的週期,但在CPU時間和內存方面更昂貴。
當然,這會創建一個克隆,但是具有令人難以置信的開銷,並且無法使用__clone魔術方法實際定義任何設置或行爲。
我會使用clone關鍵字,如果您需要進一步研究,請參閱http://php.net/manual/en/language.oop5.cloning.php的註釋部分,以瞭解克隆不需要對某個對象的更改持續存在於其克隆中的證明。
克隆,但我不知道我是否可以'證明'它。 – 2011-02-11 05:38:36
@Dagon:我同意。但任何解釋都會很好。 – Gaurav 2011-02-11 05:39:59