克隆不适合我吗?

时间:2011-02-10 16:38:54

标签: php clone

我有一个类$objDummy的对象ClassDummy,另一个是

$objClone = clone $objDummy;

然后我在$objClone进行了任何更改,$objDummy也发生了变化。 我不想那样做。 我怎样才能让它发挥作用?

编辑: 回应克里斯。 这是一个例子

<?php
class myAnotherObject{
    public $myAnotherVar =10;
}

class myObject {
    public $myVar = false;
    function __construct() {
        $this->myVar = new myAnotherObject();
    }
}


$nl = "\n";
//*
$nl = '<br />';
//*/


$obj1 = new myObject();
echo 'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar;

$obj2 = clone $obj1;

echo $nl.'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar.', obj2->myVar->myAnotherVar: '.$obj2->myVar->myAnotherVar;

$obj2->myVar->myAnotherVar = 20;
echo $nl.'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar.', obj2->myVar->myAnotherVar: '.$obj2->myVar->myAnotherVar;

输出

obj1->myVar->myAnotherVar: 10
obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 10
obj1->myVar->myAnotherVar: 20, obj2->myVar->myAnotherVar: 20

3 个答案:

答案 0 :(得分:9)

您是否正在实施__clone()方法? PHP documentation on cloning中的示例将比我可能更好地解释这一点。具体来说,你对这部分感兴趣,

  

克隆对象时,PHP 5会   执行所有的浅表副本   对象的属性。任何属性   这是对其他人的引用   变量,仍然是参考。

     

克隆完成后,如果a   定义__clone()方法,然后新创建的对象的__clone()   方法将被调用,以允许任何方法   需要的必要属性   改变。

<强>更新
根据您对问题的更新,您确实错过了__clone()的实施。由于$myVar的{​​{1}}成员本身就是一个对象,因此您也需要克隆它。这是您的myObject课程应该是什么样的,

myObject

然后输出成为以下内容,

class myObject {
    public $myVar = false;
    function __construct() {
        $this->myVar = new myAnotherObject();
    }

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

答案 1 :(得分:0)

我无法复制您的搜索结果。使用下面的代码,我得到预期的输出(复制在代码下面)。如图所示,这不需要___ clone()方法。你能发布一个精简版的代码吗?

<强> CODE

class myObject {
    public $myVar = false;
    function __construct($newVar=5) {
        $this->myVar = $newVar;
    }
}

$nl = "\n";
//*
$nl = '<br />';
//*/


$obj1 = new myObject(10);
echo 'obj1->myVar: '.$obj1->myVar;

$obj2 = clone $obj1;
echo $nl.'obj1->myVar: '.$obj1->myVar.', obj2->myVar: '.$obj2->myVar;

$obj1->myVar = 20;
echo $nl.'obj1->myVar: '.$obj1->myVar.', obj2->myVar: '.$obj2->myVar;

<强>输出

obj1->myVar: 10
obj1->myVar: 10, obj2->myVar: 10
obj1->myVar: 20, obj2->myVar: 10

讨论后编辑:

您的问题是由对象的引用引起的。由于所有对象都是通过引用处理的,因此当您克隆对象时,还需要克隆任何内部保持的对象,否则最终会引用单个对象。

<强> CODE

class myAnotherObject{
    public $myAnotherVar =10;
}

class myObject {
    public $myVar = false;
    function __construct() {
        $this->myVar = new myAnotherObject();
    }
    function __clone() {
        $this->myVar = clone $this->myVar;  
    }
}


$nl = "\n";
//*
$nl = '<br />';
//*/


$obj1 = new myObject();
echo 'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar;

$obj2 = clone $obj1;

echo $nl.'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar.', obj2->myVar->myAnotherVar: '.$obj2->myVar->myAnotherVar;

$obj2->myVar->myAnotherVar = 20;
echo $nl.'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar.', obj2->myVar->myAnotherVar: '.$obj2->myVar->myAnotherVar;

<强>输出

obj1->myVar->myAnotherVar: 10
obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 10
obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 20

答案 2 :(得分:0)

您可以执行此操作,但不适用于使用方法->

的对象
function cloneObj(&obj) {
 return json_decode(json_encode($obj));
}

$a = new stdClass();
$b = cloneObj($a);