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

2022-08-30 06:25:31

在 PHP 中,对象似乎是通过引用传递的。甚至赋值运算符似乎也没有创建对象的副本。

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

<?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'

?>

在两种打印情况下,我都“在”之后

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


答案 1

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

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

$objectB = clone $objectA;

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


答案 2

答案在Java书籍中很常见。

  1. 克隆:如果不覆盖克隆方法,则默认行为为浅复制。如果您的对象只有原始成员变量,则完全没问题。但是在以另一个对象作为成员变量的无类型语言中,这是一个令人头疼的问题。

  2. 序列化/反序列化

$new_object = unserialize(serialize($your_object))

这实现了深度复制,但成本很高,具体取决于对象的复杂程度。


推荐