【发布时间】:2010-09-16 04:51:11
【问题描述】:
似乎在 PHP 中对象是通过引用传递的。甚至赋值运算符似乎也没有创建 Object 的副本。
这是一个简单的、人为的证明:
<?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()?
【问题讨论】:
-
在极少数情况下,您实际上需要这种行为。因此,如果您发现自己经常使用它,那么您编写代码的方式可能存在更根本的问题?
-
不,还不需要使用它。
-
(object) ((array) $objectA)可能会为您带来相同的预期结果,但使用clone $objectA或new stdClass时性能更好。 -
Re “即使赋值运算符似乎也没有创建对象的副本。” - 我希望不会!如果他们这样做了,结果将不再是 OO 语言(出于所有实际目的)。
标签: php copy clone shallow-copy