试图克隆一个 stdClass

Posted

技术标签:

【中文标题】试图克隆一个 stdClass【英文标题】:Trying to clone a stdClass 【发布时间】:2013-04-03 11:22:57 【问题描述】:

我正在尝试克隆一个具有 DateTime 属性的 stdClass 对象。但它失败了。看起来克隆不起作用。我应该编写自己的 __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 日) 【参考方案1】:

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

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

【讨论】:

对我不起作用,仍然引用原始 obj?【参考方案2】:

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

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

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

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

【讨论】:

有一个肮脏的黑客来深度克隆一个stdClass:$cloned = unserialize(serialize($object));【参考方案3】:

还有一个更简单的选择:

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

【讨论】:

看,我仔细检查了这个答案并为我工作,所以我不会删除这个答案,因为可以帮助别人。

以上是关于试图克隆一个 stdClass的主要内容,如果未能解决你的问题,请参考以下文章

PHP SoapClient参数仅在我使用StdClass时才有效

PHP中的对象复制与克隆

PHP错误:不能将stdClass类型的对象用作数组(数组和对象问题)[重复]

如何附加一个 stdClass 对象

试图克隆 Repo 但收到这个奇怪的 RSA 消息

将 stdClass 对象转换/转换为另一个类