Nic*_*tes 151 php clone copy shallow-copy
看来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'
?>
Run Code Online (Sandbox Code Playgroud)
在两个印刷案例中,我都在"追求"
那么,我如何通过值传递$ a到set_b(),而不是通过引用?
Era*_*rin 256
在PHP 5+对象通过引用传递.在PHP 4中,它们通过值传递(这就是为什么它通过引用传递运行时,它被弃用).
您可以使用PHP5中的'clone'运算符来复制对象:
$objectB = clone $objectA;
Run Code Online (Sandbox Code Playgroud)
此外,它只是通过引用传递的对象,而不是你在问题中所说的所有内容......
yog*_*man 97
答案常见于Java书籍.
克隆:如果不重写克隆方法,则默认行为是浅拷贝.如果你的对象只有原始成员变量,那就完全可以了.但是在使用另一个对象作为成员变量的无类型语言中,这是一个令人头痛的问题.
序列化/反序列化
$new_object = unserialize(serialize($your_object))
这取决于对象的复杂性,以高成本实现深拷贝.
Sta*_*lav 19
根据之前的评论,如果您有另一个对象作为成员变量,请执行以下操作:
class MyClass {
private $someObject;
public function __construct() {
$this->someObject = new SomeClass();
}
public function __clone() {
$this->someObject = clone $this->someObject;
}
}
Run Code Online (Sandbox Code Playgroud)
现在你可以做克隆:
$bar = new MyClass();
$foo = clone $bar;
Run Code Online (Sandbox Code Playgroud)
根据文档(http://ca3.php.net/language.oop5.cloning):
$a = clone $b;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
107893 次 |
| 最近记录: |