gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:08:02 25 4
gpt4 key购买 nike

当克隆一个对象是另一个对象的子对象时,是否“需要”指示子类 __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;
}

或者以下是否足够,因为父对象的克隆方法已经包含 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());
}
}

第一次尝试实例化类时出现 fatal error 。

其次,您在那里没有使用 $a_2,因此 Child_A::__clone 将导致 undefined variable A_2 的通知。

最后,回答这个问题——不,如果没有显式调用,parent 的__clone 不会被调用。推荐的解决方案是让子进程只处理自己属性的克隆,让父进程关心它的属性:

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

关于php - 如何处理子类对象属性的 __clone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34281676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com