2013-04-11 114 views
3

我想克隆一個stdClass對象,它具有一個屬於DateTime的屬性。但它失敗了。它看起來像克隆不起作用。我應該寫我自己的__clone()方法嗎? 這裏有什麼問題?試圖克隆stdClass

的代碼:

$object = new stdClass; 
$object->date = new DateTime(); 
var_dump($object->date); 

$cloned = clone($object); 
$object->date->modify('+1 day'); 
var_dump($cloned->date); 

輸出:

object DateTime (
    ->date = string (19) '2013-04-11 11:54:00' 
    ->timezone_type = int 3 
    ->timezone = string (13) 'Europe/Berlin' 

object DateTime (
    ->date = string (19) '2013-04-12 11:54:00' 
    ->timezone_type = int 3 
    ->timezone = string (13) 'Europe/Berlin' 
+0

爲什麼不呢?這是第11天和第12天之後的一天 – Voitcus 2013-04-11 10:01:36

回答

2

當克隆對象,所有的對象屬性是簡單地複製超過到對象的新實例。實際上這樣的:

$cloned = new stdClass; 
$cloned->date = $object->date; 

正如你可能知道,分配一個對象到另一個變量不重複的對象;仍然只有一個對象,現在有兩個引用。

深克隆需要實現與它的__clone method手動clone任何子對象的自定義類的對象。

+8

深入克隆stdClass有一個骯髒的黑客攻擊: \t $ cloned = unserialize(serialize($ object)); – Spir 2013-04-11 10:26:15

6

如何通過鑄鏈 「克隆」 一個PHP POSCO(普通老式一個StdClass對象):

$cloneObj = (object) (array) $myPOSCO; 
var_dump($cloneObj == $myPOSCO); // true 
var_dump($cloneObj === $myPOSCO); // false 
+0

不適用於我,仍然引用原始的obj? – 2016-10-18 11:38:10