首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在PHP中创建对象的副本?

如何在PHP中创建对象的副本?
EN

Stack Overflow用户
提问于 2008-10-09 04:21:04
回答 9查看 142.2K关注 0票数 189

在PHP中,对象似乎是通过引用传递的。即使是赋值操作符似乎也不会创建对象的副本。

这里有一个简单的,人为的证明:

代码语言:javascript
复制
<?php

class A {
    public $b;
}


function set_b($obj) { $obj->b = "after"; }

$a = new A();
$a->b = "before";
$c = $a; //i would especially expect this to create a copy.

set_b($a);

print $a->b; //i would expect this to show 'before'
print $c->b; //i would ESPECIALLY expect this to show 'before'

?>

在这两种打印情况下,我都得到了'after‘

那么,如何通过值而不是引用将$a传递给set_b()呢?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2008-10-09 04:24:10

在PHP中,5+对象是通过引用传递的。在PHP4中,它们是通过值传递的(这就是为什么它有按引用传递的运行时,这已经被弃用了)。

您可以在PHP5中使用'clone‘操作符来复制对象:

代码语言:javascript
复制
$objectB = clone $objectA;

此外,它只是通过引用传递的对象,而不是您在问题中所说的所有内容……

票数 317
EN

Stack Overflow用户

发布于 2008-10-09 05:28:55

答案通常可以在Java书籍中找到。

  1. 克隆:如果不覆盖克隆方法,则默认行为是浅拷贝。如果你的对象只有原始成员变量,这完全没问题。但在使用另一个对象作为成员变量的无类型语言中,它是一个headache.
  2. serialization/deserialization

$new_object = unserialize(serialize($your_object))

这实现了深度复制,但根据对象的复杂性,成本很高。

票数 117
EN

Stack Overflow用户

发布于 2008-10-09 06:53:08

根据前面的评论,如果您有另一个对象作为成员变量,请执行以下操作:

代码语言:javascript
复制
class MyClass {
  private $someObject;

  public function __construct() {
    $this->someObject = new SomeClass();
  }

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

}

现在你可以进行克隆了:

代码语言:javascript
复制
$bar = new MyClass();
$foo = clone $bar;
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/185934

复制
相关文章

相似问题

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