PHP - 编辑对象克隆会影响原始对象

时间:2014-11-25 19:02:50

标签: php oop object clone

所以我有一个对象,我们称之为示例。

class Example {
    public function __construct ($id) {
        $this->Id = $id;
    }
}

$objectA = new Example(10);

它有一个id(它从某个地方拉出来),该对象的目标是用这个对象的属性覆盖一个类似的对象(发布到外部服务)。这可以通过简单地更改对象的ID并运行 - > update()方法来完成。但是,它必须首先更改其ID(以及其他属性)以匹配对象B的ID。

所以我做的是克隆当前对象,重新分配所需的属性,然后将该克隆对象传递给update方法,以便更新方法使用$ 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的值被重新分配给传入的$ id - > setParameters(),即使我试图将它分配给$ this的克隆,而不是$这个本身。

我的印象是$ objectA = $ objectB将ObjectB分配给指向ObjectA的同一指针,但是" clone"本来应该实际制作该对象的副本,这样如果克隆的属性发生变化,原始对象就不会受到影响,但这似乎并非如此。我应该使用一种特殊的方法来确保原始对象的值在克隆时不会被更改吗?

2 个答案:

答案 0 :(得分:1)

我认为你想要的是一个深刻的克隆。看一下这个link.

答案 1 :(得分:0)

我遇到的问题是它出现的浅层克隆问题。

忘掉我上面引用的内容,问题更是如此: -

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对象时,它正在为它的属性创建一个新变量,但如果它的一个属性是一个对象或数组,它就是为新克隆复制该对象或数组的地址宾语。上述方法可以防止这种情况,并进行“深度”复制。