当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在PHP中创建对象的副本?》经验,为你挑选了4个好方法。

看来PHP对象是通过引用传递的.甚至赋值运算符似乎也没有创建Object的副本.

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

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'

?>

在两个印刷案例中,我都在"追求"

那么,我如何通过值传递$ aset_b(),而不是通过引用?



1> Eran Galperi..:

在PHP 5+对象通过引用传递.在PHP 4中,它们通过值传递(这就是为什么它通过引用传递运行时,它被弃用).

您可以使用PHP5中的'clone'运算符来复制对象:

$objectB = clone $objectA;

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


纠正一个常见的误解(我认为即使PHP文档也错了!)PHP 5的对象不是"通过引用传递".与在Java中一样,它们具有*附加*级别的间接 - 变量指向"对象指针",并指向对象.因此,两个变量可以指向同一个对象*,而不是*引用相同的值.从这个例子中可以看出:`$ a = new stdClass; $ b =&$ a; $ a = 42; var_export($ b);`here` $ b`是对*变量*`$ a`的引用; 如果用正常的`=`替换`=&`,它不是*引用,仍然指向原始对象.

2> yogman..:

答案常见于Java书籍.

    克隆:如果不重写克隆方法,则默认行为是浅拷贝.如果你的对象只有原始成员变量,那就完全可以了.但是在使用另一个对象作为成员变量的无类型语言中,这是一个令人头痛的问题.

    序列化/反序列化

$new_object = unserialize(serialize($your_object))

这取决于对象的复杂性,以高成本实现深拷贝.


+1非常好,很棒,很棒的方式在PHP中执行DEEP复制,非常简单.让我来问你一些关于PHP clone关键字提供的标准浅拷贝,你说只有原始成员变量被复制:PHP数组/字符串被认为是原始成员变量,所以它们被复制了,我是对的吗?
对于任何选择它的人:一个"浅"副本(`$ a = clone $ b`,没有魔术`__clone()`方法在玩)相当于在术语中查看对象`$ b`的每个属性,并使用`=`分配给同一类的新成员中的相同属性.作为对象的属性不会得到`clone`d,也不会得到数组中的对象; 对于通过引用约束的变量也是如此; 其他一切只是一个值,并像任何任务一样被复制.
完善!json_decode(json_encode($ OBJ)); 不克隆私有/受保护的属性和任何方法...反序列化(序列化也不克隆方法...

3> Stanislav..:

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

class MyClass {
  private $someObject;

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

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

}

现在你可以做克隆:

$bar = new MyClass();
$foo = clone $bar;



4> Leo..:

根据文档(http://ca3.php.net/language.oop5.cloning):

$a = clone $b;

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有