之前在开发过程中发现php的对象克隆还是比较奇怪的,到底是复制还是引用今天梳理了一下
(1)这种就是实实在在的引用了,两个对象都是指向了同一个内存地址
<?php class C{} $c = new C(); $c2 = $c; $c->p = 'x'; echo $c2->p; //x ?>
(2)可以发现clone对于变量和数组确实是复制的,但对象其实还是引用
<?php class C{ public $vari; //普通变量 public $obj; //对象 public $arr; //数组 public $fun; public function __construct() { $this->obj = new stdClass(); $this->obj->param = 'param'; $this->arr = array('1'); $this->vari = 'vari'; } } $c = new C(); $c2 = clone $c; //测试 $c->vari = 'vari c'; $c->obj->param = 'param c'; $c->arr = array('array c'); print_r($c2->arr); //['1'] 复制 print_r($c2->obj->param); //param c 引用 print_r($c2->vari); //vari 复制 ?>
(3)如果真的想实现深度拷贝,可以序列化之后再反序列化
$c = new C(); $tmp = serialize($c); $c2 = unserialize($tmp);