所以我有一个对象,我们称它为Example。
class Example {
public function __construct ($id) {
$this->Id = $id;
}
}
$objectA = new Example(10);它有一个id (它从某个地方拉出),这个对象的目标是用这个对象的属性覆盖一个类似的对象(post到外部服务)。这只需更改对象的ID并运行->update()方法即可。但是,它必须首先更改其ID (以及其他属性)以匹配对象B的ID。
因此,我要做的是克隆当前对象,重新分配所需的属性,然后将克隆的对象传递给更新方法,以便更新方法使用$post值进行更新。
public function createPost ($id) {
$post = clone $this;
$post->Id = $id;
return $post;
}
$objectA->update($objectA->createPost(12));
$objectA->update($objectA->createPost(16));
$objectA->update($objectA->createPost(21));我遇到的问题是这个对象A需要用于多个不同的更新,它使用最初分配给它的ID作为指针,指向以后必须用于$post的ID,在这个场景中,$ this ->ID的值被重新分配给在->setParameters()中传递的$id,尽管我试图将它分配给$this的克隆,而不是$this本身。
我的印象是,$objectA = $objectB将ObjectB赋值给指向ObjectA的同一指针,但“克隆”实际上应该复制该对象,因此如果克隆的属性发生更改,原始对象不会受到影响,但这里似乎不是这样。有没有一种特别的方法,我应该用来确保原始对象的值在克隆对象时不会发生变化?
发布于 2014-11-26 03:11:13
我想你想要的是一个深度克隆。看一下这个link.
发布于 2014-11-26 03:43:04
我在这里遇到的问题是一个很浅的克隆问题。
忘记我上面提到的,问题更多的是这样的:
class Example {
public function __construct ($id) {
$this->ObjId = (object)array("Id" => 5);
$this->Id = $id;
}
}
$example = new Example (5);
$clone = clone $example;
$clone->ObjId->Id = 10;在本例中,我试图更改存储在我的主对象(我使用json_encode来提取整个对象结构)中的一个标准php对象的->Id,该对象名为"Id“。以上结果如下:
echo $example->ObjId->Id; //10
echo $example->Id; //5
echo $clone->ObjId->Id; //10
echo $clone->Id; //5所以我不得不把这个方法写成Example类的一部分:
public function __clone () {
foreach ($this as $key => $val) {
if (is_object($val) || (is_array($val))) {
$this->{$key} = unserialize(serialize($val));
}
}
}现在,结果是这样的:
echo $example->ObjId->Id; //5
echo $example->Id; //5
echo $clone->ObjId->Id; //10
echo $clone->Id; //5这是因为当我克隆主Example对象时,它正在为它的属性创建一个新的变量,但是如果它的一个属性是一个对象或数组,它就会复制新克隆对象的那个对象或数组的地址。上面的方法防止了这种情况,并进行了“深度”复制。
https://stackoverflow.com/questions/27134638
复制相似问题