Php 正在尝试克隆stdClass

Php 正在尝试克隆stdClass,php,clone,stdclass,Php,Clone,Stdclass,我正在尝试克隆一个stdClass对象,它的attribute是DateTime。但它失败了。看来克隆不起作用了。我应该写我自己的克隆()方法吗? 这里怎么了 守则: $object = new stdClass; $object->date = new DateTime(); var_dump($object->date); $cloned = clone($object); $object->date->modify('+1 day'); var_dump($clo

我正在尝试克隆一个stdClass对象,它的attribute是DateTime。但它失败了。看来克隆不起作用了。我应该写我自己的克隆()方法吗? 这里怎么了

守则:

$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'

克隆对象时,所有对象属性只需复制到对象的新实例。实际上:

$cloned = new stdClass;
$cloned->date = $object->date;
您可能知道,将一个对象指定给另一个变量不会复制该对象;仍然只有一个对象,现在有两个引用

要深度克隆对象,您需要使用实现自定义类,并手动克隆它的任何子对象。

如何通过强制转换链接“克隆”一个phpPOSCO(普通的旧StdClass对象):

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

还有一个更简单的选择:

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

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

var_dump($cloned->date);
var_dump($object->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-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'

为什么不呢?就在第二天(第11对第12),有一个肮脏的黑客深度克隆了一个stdClass:$cloned=unserialize(serialize($object));对我不起作用,仍然引用原始obj?看,我仔细检查了这个答案并为我工作,所以我不会删除这个答案,因为我可以帮助别人。