我有一个类$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
答案 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);