php5中的clone生成一个独立的对象,类似c++中的浅拷贝,
<?php
class SimpleClass{
public $var = 'a';
public $data;
}
$a=new SimpleClass;
$a->data=&$sss;
$b=clone $a;
$b->data="bbb";
$b->var="b";
var_dump($a);
var_dump($b);
结果:
object(SimpleClass)[1]
public 'var' => string 'a' (length=1)
public 'data' => &string 'bbb' (length=3)
object(SimpleClass)[2]
public 'var' => string 'b' (length=1)
public 'data' => &string 'bbb' (length=3)
解决这个问题的方法是使用php中的魔术方法__clone(),将浅拷贝转成深拷贝。
<?php
class SimpleClass{
public $var = 'a';
public $data;
//浅拷贝转深拷贝时,只将赋值为引用的数据成员转换,其他成员无需转换,否则会报错。
public function __clone(){
$this->data=clone $this->data;
}
public function __construct(){
$this->data=new Test;
}
}
class Test{
public $num=0;
}
$a=new SimpleClass;
$a->data->num="aaa";
$b=clone $a;
$b->data->num="bbb";
$b->var="b";
var_dump($a);
var_dump($b);
结果:
object(SimpleClass)[1]
public 'var' => string 'a' (length=1)
public 'data' =>
object(Test)[2]
public 'num' => string 'aaa' (length=3)
object(SimpleClass)[3]
public 'var' => string 'b' (length=1)
public 'data' =>
object(Test)[4]
public 'num' => string 'bbb' (length=3)