尝试克隆一个stdClass对象

7

我想克隆一个包含DateTime属性的stdClass对象,但失败了。看起来clone不起作用。我应该编写自己的__clone()方法吗?这里有什么问题?

代码:

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

为什么不呢?这是在11日和12日之后的一天。 - Voitcus
3个回答

12

如何通过转换链接“克隆”一个php POSCO (Plain Old StdClass Object):

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

1
对我不起作用,仍然引用原始对象? - Matt The Ninja

4

当克隆一个对象时,所有的对象属性都会被简单地复制到新的对象实例中。实际上,这样做就是:

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

你可能知道,将一个对象赋值给另一个变量并不会复制该对象;仍然只有一个对象,现在有两个对它的引用。

要进行深层复制(deep-clone)一个对象,需要实现一个自定义类,并使用__clone方法手动克隆它的任何子对象。


11
有一个用于深度克隆stdClass对象的不太正规的方法:$cloned = unserialize(serialize($object)); - Spir

-1

还有一个更简单的选择:

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

看,我再次检查了这个答案并且它对我有效,所以我不会移除这个答案,因为它可以帮助其他人。 - Luiz Rossi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接