2011-02-11 44 views
3

隨着this問題的參考,我得到了一個另一種解決方案是 使用__clone()vs unserialize(serialize())?

$obj2 = unserialize(serialize($obj1)); 

代替

$obj2 = clone $obj1; 

哪一個是更好地使用?

+0

克隆,但我不知道我是否可以'證明'它。 – 2011-02-11 05:38:36

+0

@Dagon:我同意。但任何解釋都會很好。 – Gaurav 2011-02-11 05:39:59

回答

10

tl; dr版本:對簡單對象和樹使用clone,對於複雜的對象圖使用unserialize(serialize())

更詳細的解釋:除非$obj1工具__clone(),表達clone $obj1將返回淺拷貝的$obj1,但共享對象的內容通過$obj1指向。即使__clone()被實現以通過成員的遞歸clone來執行深度複製,如果對象圖是樹,它將只能安全地工作。如果對象圖包含循環,它將無限期地遞歸,並且......這是Stack Overflow的原因。 :-)如果它是一個有向非循環圖,但不是樹,多次引用的任何對象都會將這些多個引用替換爲副本,這可能不是您想要的。另一方面,將處理對象圖中的週期,但在CPU時間和內存方面更昂貴。

3

當然,這會創建一個克隆,但是具有令人難以置信的開銷,並且無法使用__clone魔術方法實際定義任何設置或行爲。

我會使用clone關鍵字,如果您需要進一步研究,請參閱http://php.net/manual/en/language.oop5.cloning.php的註釋部分,以瞭解克隆不需要對某個對象的更改持續存在於其克隆中的證明。