【问题标题】:Trying to clone a stdClass试图克隆一个 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 日)

标签: php clone stdclass


【解决方案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'

【讨论】:

  • 看,我仔细检查了这个答案并为我工作,所以我不会删除这个答案,因为可以帮助别人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2012-05-06
  • 1970-01-01
  • 2018-04-05
  • 2022-01-20
  • 2015-07-13
  • 1970-01-01
相关资源
最近更新 更多