首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PHP中的子对象克隆对象

用PHP中的子对象克隆对象
EN

Stack Overflow用户
提问于 2014-09-25 10:52:18
回答 1查看 818关注 0票数 1

我有一个对象(称为a),它包含另外两个对象(称为b)的数组。我正试图克隆那个物体。当我克隆对象时,我还想克隆另外两个对象。但是,当我运行一个代码来更改原始对象(A)数组中的子对象(B)时,它也会更改克隆对象(A)中的对象(B)数组。我怎么才能防止这件事?这是我的密码:

代码语言:javascript
复制
<?php
class a{
    public $b = array();

    function __clone(){
        foreach($this->b AS $key => $b){
            $this->b[$key]  = clone $b;
        }   
    }

    function addB($name,$b){
        $b->setA($this);
        $this->b[$name] = $b;
    }


}

class b{
    public $a;
    public $var = 'no';
    function execute(){
        $this->var  = 'yes';
    }

    function seeB1(){
        return $this->a->b['b1']->var;
    }

    function setA($a){
        $this->a    = $a;
    }
}



$a1 = new a;
$b1 = new b;
$b2 = new b;

$a1->addB('b1',$b1);
$a1->addB('b2',$b2);


//Clones A
$a2 = clone $a1;


$a1->b['b1']->execute();

var_dump($a1->b['b2']->seeB1()); //This should say Yes. It does
var_dump($a2->b['b2']->seeB1()); //This should say No. It says Yes

?>

产出如下:

代码语言:javascript
复制
string 'yes' (length=3)

string 'yes' (length=3)

我想对这个脚本做的是克隆A。在我克隆A之后,我运行原始b1的函数execute()来更改$var。然后从原始的b1中查看原始的b2。这表明原来的$var b1已经改变了,这是应该的。但是,如果我从克隆的b1中查看克隆的b1,也会发现$var已经发生了变化。它不应该。

我做错什么了?

你好,汤姆。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-25 12:39:52

您可以尝试用以下内容替换您的__clone函数:

代码语言:javascript
复制
function __clone() {
    foreach ($this as $key => $value) {
        if (is_object($value) || (is_array($value))) {
            $this->{$key} = unserialize(serialize($value));
        }
    }
}

通过使用序列化/非序列化方法,您肯定会避免更改对象的原始属性。

测试它,它可以很好地工作在简单的对象,如您的例子中的对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26036750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档