Search code examples
phpclonestdclass

Trying to clone a stdClass


I'm trying to clone a stdClass object that have an attribut which is a DateTime. But it fails. It looks like the clone is not working. Should I wrote my own __clone() method? What is wrong here?

The code:

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

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

The output:

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'

Solution

  • When cloning an object, all the object properties are simply copied over to a new instance of the object. In effect this:

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

    As you probably know, assigning an object to another variable does not duplicate the object; there's still just one object, now with two references to it.

    To deep-clone an object you need to implement a custom class with the __clone method and manually clone any child objects of it.