首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP -编辑对象克隆会影响原始对象

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

Stack Overflow用户
提问于 2014-11-26 03:02:50
回答 2查看 1.3K关注 0票数 0

所以我有一个对象,我们称它为Example。

代码语言:javascript
复制
class Example {
    public function __construct ($id) {
        $this->Id = $id;
    }
}

$objectA = new Example(10);

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

因此,我要做的是克隆当前对象,重新分配所需的属性,然后将克隆的对象传递给更新方法,以便更新方法使用$post值进行更新。

代码语言:javascript
复制
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的同一指针,但“克隆”实际上应该复制该对象,因此如果克隆的属性发生更改,原始对象不会受到影响,但这里似乎不是这样。有没有一种特别的方法,我应该用来确保原始对象的值在克隆对象时不会发生变化?

EN

回答 2

Stack Overflow用户

发布于 2014-11-26 03:11:13

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

票数 1
EN

Stack Overflow用户

发布于 2014-11-26 03:43:04

我在这里遇到的问题是一个很浅的克隆问题。

忘记我上面提到的,问题更多的是这样的:

代码语言:javascript
复制
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“。以上结果如下:

代码语言:javascript
复制
echo $example->ObjId->Id; //10
echo $example->Id; //5

echo $clone->ObjId->Id; //10
echo $clone->Id; //5

所以我不得不把这个方法写成Example类的一部分:

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

现在,结果是这样的:

代码语言:javascript
复制
echo $example->ObjId->Id; //5
echo $example->Id; //5

echo $clone->ObjId->Id; //10
echo $clone->Id; //5

这是因为当我克隆主Example对象时,它正在为它的属性创建一个新的变量,但是如果它的一个属性是一个对象或数组,它就会复制新克隆对象的那个对象或数组的地址。上面的方法防止了这种情况,并进行了“深度”复制。

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

https://stackoverflow.com/questions/27134638

复制
相关文章

相似问题

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