当前位置:  开发笔记 > 编程语言 > 正文

如何处理子类对象属性的__clone

如何解决《如何处理子类对象属性的__clone》经验,为你挑选了1个好方法。

克隆作为另一个对象的子对象的对象时,是否"需要"指示子类__clone()方法中作为对象的所有父属性,或者子类__clone()方法是否只能包含其自己不属于该对象属性的对象属性父对象?

这是一个例子

该对象Child_A扩展了该对象Parent_A.

该对象在其构造函数中Parent_A使用该对象A_1并具有__clone()方法.

class Parent_A{

   function __construct(A_1 $a_1){
      $this->A_1 = $a_1;
   }

   function __clone(){
      $this->A_1 = clone $this->A_1;
   }
}

该对象Child_A需要A_2构造.

class Child_A{

   function __construct(A_2 $a_2){
      parent::__construct(new A_1());

   }

   function __clone(){

      $this->A_2 = clone $this->A_2;
   }
}

如果我想要Child_A包含一个deep_copy 的深层副本A_1,我应该使用Child_A:

   function __clone(){

      $this->A_1 = clone $this->A_1;
      $this->A_2 = clone $this->A_2;
   }

或者以下内容足够,因为父对象的clone方法已经包含A_1:

   function __clone(){

      $this->A_2 = clone $this->A_2;
   }

谢谢.



1> Alex Blex..:

首先,你Child_A没有延伸Parent_A,所以这种结构

class Child_A {

    function __construct(A_2 $a_2){
        parent::__construct(new A_1());
    }
}

第一次尝试实例化该类时导致致命错误的结果.

其次,你没有使用$a_2那里,因此Child_A::__clone将通知未定义的变量A_2.

最后,回答这个问题 - 不,如果没有明确调用,__clone则不调用parent .建议的解决方案是让子进程只处理它自己的属性的克隆,并让parent关注它的属性:

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();
    }
}

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有