When cloning an object that is a child of another object, is it "required" to indicate all the parent properties that are objects in the child class __clone() method or does the child class __clone() method can only include its own object properties that does not belong to the parent object?
Here is an example
The object Child_A extends the object Parent_A.
The object Parent_A uses the object A_1 in its constructor and has a __clone() method.
class Parent_A{
   function __construct(A_1 $a_1){
      $this->A_1 = $a_1;
   }
   function __clone(){
      $this->A_1 = clone $this->A_1;
   }
}
The object Child_A requires A_2 to construct.
class Child_A{
   function __construct(A_2 $a_2){
      parent::__construct(new A_1());
   }
   function __clone(){
      $this->A_2 = clone $this->A_2;
   }
}
If I want to make a deep copy of Child_A that would include a deep_copy A_1, should I use in Child_A:
   function __clone(){
      $this->A_1 = clone $this->A_1;
      $this->A_2 = clone $this->A_2;
   }
Or is the following enough as the parent object's clone method already includes A_1:
   function __clone(){
      $this->A_2 = clone $this->A_2;
   }
Thank you.
First of all, your Child_A does not extend Parent_A, so this construction
class Child_A {
    function __construct(A_2 $a_2){
        parent::__construct(new A_1());
    }
}
results with fatal error on the first attempt to instantiate the class.
Secondly, you make no use of $a_2 there, so Child_A::__clone will result with notice of undefined variable A_2.
Finally, to answer the question - no, if not explicitly called, parent's __clone is not invoked. The recommended solution is to let the child handle clone of its own properties only, and let parent take care about its properties:
class Parent_A
{
    protected $a_1;
    function __construct(A_1 $a_1)
    {
        $this->a_1 = $a_1;
    }
    function __clone()
    {
        $this->a_1 = clone $this->a_1;
    }
}
class Child_A extends Parent_A
{
    protected $a_2;
    function __construct(A_2 $a_2)
    {
        $this->a_2 = $a_2;
        parent::__construct(new A_1);
    }
    function __clone()
    {
        $this->a_2 = clone $this->a_2;
        return parent::__clone();
    }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With