克隆作为另一个对象的子对象的对象时,是否"需要"指示子类__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; }
谢谢.
首先,你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(); } }