在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'
?>
在这两种打印情况下,我都得到了'after‘
那么,如何通过值而不是引用将$a传递给set_b()呢?
发布于 2008-10-09 04:24:10
在PHP中,5+对象是通过引用传递的。在PHP4中,它们是通过值传递的(这就是为什么它有按引用传递的运行时,这已经被弃用了)。
您可以在PHP5中使用'clone‘操作符来复制对象:
$objectB = clone $objectA;
此外,它只是通过引用传递的对象,而不是您在问题中所说的所有内容……
发布于 2008-10-09 05:28:55
答案通常可以在Java书籍中找到。
$new_object = unserialize(serialize($your_object))
这实现了深度复制,但根据对象的复杂性,成本很高。
发布于 2008-10-09 06:53:08
根据前面的评论,如果您有另一个对象作为成员变量,请执行以下操作:
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;
https://stackoverflow.com/questions/185934
复制相似问题