看来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' ?>
在两个印刷案例中,我都在"追求"
那么,我如何通过值传递$ a到set_b(),而不是通过引用?
在PHP 5+对象通过引用传递.在PHP 4中,它们通过值传递(这就是为什么它通过引用传递运行时,它被弃用).
您可以使用PHP5中的'clone'运算符来复制对象:
$objectB = clone $objectA;
此外,它只是通过引用传递的对象,而不是你在问题中所说的所有内容......
答案常见于Java书籍.
克隆:如果不重写克隆方法,则默认行为是浅拷贝.如果你的对象只有原始成员变量,那就完全可以了.但是在使用另一个对象作为成员变量的无类型语言中,这是一个令人头痛的问题.
序列化/反序列化
$new_object = unserialize(serialize($your_object))
这取决于对象的复杂性,以高成本实现深拷贝.
根据之前的评论,如果您有另一个对象作为成员变量,请执行以下操作:
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;
根据文档(http://ca3.php.net/language.oop5.cloning):
$a = clone $b;