Clone is not working for me?

前端 未结 3 617
感动是毒
感动是毒 2020-12-11 23:39

I have an object $objDummy of some class ClassDummy and another is as

$objClone = clone $objDummy;

Then I make any ch

相关标签:
3条回答
  • 2020-12-11 23:45

    You can do this, but not for objects with methods ->

    function cloneObj(&obj) {
     return json_decode(json_encode($obj));
    }
    
    $a = new stdClass();
    $b = cloneObj($a);
    
    0 讨论(0)
  • 2020-12-12 00:01

    I am not able to replicate your results. Using the code below, I get the expected output (copied below the code). The ___clone() method is not required for this, as illustrated. Can you post a slimmed-down version of your code?

    CODE

    class myObject {
        public $myVar = false;
        function __construct($newVar=5) {
            $this->myVar = $newVar;
        }
    }
    
    $nl = "\n";
    //*
    $nl = '<br />';
    //*/
    
    
    $obj1 = new myObject(10);
    echo 'obj1->myVar: '.$obj1->myVar;
    
    $obj2 = clone $obj1;
    echo $nl.'obj1->myVar: '.$obj1->myVar.', obj2->myVar: '.$obj2->myVar;
    
    $obj1->myVar = 20;
    echo $nl.'obj1->myVar: '.$obj1->myVar.', obj2->myVar: '.$obj2->myVar;
    

    OUTPUT

    obj1->myVar: 10
    obj1->myVar: 10, obj2->myVar: 10
    obj1->myVar: 20, obj2->myVar: 10
    

    Edited after discussion:

    Your issue is caused by a reference to an object. Since all objects are handled by reference, when you clone an object you also need to clone any internally held objects, otherwise you end up with a reference to a single object.

    CODE

    class myAnotherObject{
        public $myAnotherVar =10;
    }
    
    class myObject {
        public $myVar = false;
        function __construct() {
            $this->myVar = new myAnotherObject();
        }
        function __clone() {
            $this->myVar = clone $this->myVar;  
        }
    }
    
    
    $nl = "\n";
    //*
    $nl = '<br />';
    //*/
    
    
    $obj1 = new myObject();
    echo 'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar;
    
    $obj2 = clone $obj1;
    
    echo $nl.'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar.', obj2->myVar->myAnotherVar: '.$obj2->myVar->myAnotherVar;
    
    $obj2->myVar->myAnotherVar = 20;
    echo $nl.'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar.', obj2->myVar->myAnotherVar: '.$obj2->myVar->myAnotherVar;
    

    OUTPUT

    obj1->myVar->myAnotherVar: 10
    obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 10
    obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 20
    
    0 讨论(0)
  • 2020-12-12 00:05

    Are you implementing the __clone() method? The examples in the PHP documentation on cloning will explain this better than I possibly can. Specifically you're interested in this part,

    When an object is cloned, PHP 5 will perform a shallow copy of all of the object's properties. Any properties that are references to other variables, will remain references.

    Once the cloning is complete, if a __clone() method is defined, then the newly created object's __clone() method will be called, to allow any necessary properties that need to be changed.

    UPDATE
    Based on your update to the question, you're indeed missing the implementation of __clone(). Since the $myVar member of myObject is itself an object, you need to clone that as well. Here's what your myObject class should look like,

    class myObject {
        public $myVar = false;
        function __construct() {
            $this->myVar = new myAnotherObject();
        }
    
        function __clone() {
            $this->myVar = clone $this->myVar;
        }
    }
    

    The output then becomes the following,

    obj1->myVar->myAnotherVar: 10
    obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 10
    obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 20
    
    0 讨论(0)
提交回复
热议问题