在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()***呢?
9条答案
按热度按时间wgmfuz8q1#
在PHP 5+中,对象是通过引用传递的。在PHP 4中,对象是通过值传递的(这就是为什么它有运行时通过引用传递,这已经过时了)。
你可以使用PHP5中的'clone'操作符来复制对象:
而且,它只是通过引用传递的对象,而不是您在问题中所说的所有内容...
wb1gzix02#
答案通常可以在Java书籍中找到。
1.串行化/反串行化
$new_object = unserialize(serialize($your_object))
这以取决于对象的复杂性的高成本来实现深度复制。
fdbelqdn3#
根据前面的注解,如果您有另一个对象作为成员变量,请执行以下操作:
现在您可以执行克隆:
neskvpey4#
根据文件(http://ca3.php.net/language.oop5.cloning):
a5g8bdjr5#
只是为了澄清PHP使用写时复制,所以基本上所有的东西都是引用,直到你修改它,但是对于对象你需要使用clone和__clone()魔术方法,就像在接受的答案。
z2acfund6#
此代码有助于克隆方法
zrfyljdw7#
我做了些测试然后得到了这个:
tvokkenx8#
在本例中,我们将创建iPhone类,并通过克隆从该类创建精确副本
efzxgjgh9#
如果要完全复制不同示例中对象的特性,可能需要使用以下方法:
将其序列化为JSON,然后反序列化回Object。