7

我正在尝试克隆一个具有 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'
4

3 回答 3

11

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

$cloneObj = (object) (array) $myPOSCO;
var_dump($cloneObj == $myPOSCO); // true
var_dump($cloneObj === $myPOSCO); // false
于 2015-05-07T22:05:06.660 回答
4

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

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

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

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

于 2013-04-11T10:03:31.353 回答
-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'
于 2019-02-27T19:16:22.510 回答