一、赋值(copy)
1)基本数据类型:互不印象。
2)引用数据类型:对引用类型进行赋址操作,改变a会影响b(包括基本的数据类型&),若不希望改变a影响b,就要用到深拷贝和浅拷贝。PHP中对对象的直接“赋值”相当于引用。
//一、普通对象赋值
//1)基本数据类型
$m = 1;
$n = $m;
$n = 2;
echo $m; //1
echo $n; //2
//2)引用数据类型
class Test{
public $a = 1;
}
$m = new Test();
$n = $m;
$m->a = 2;
echo $n->a; //2
echo $m->a; //2
二、浅拷贝(shallow copy)
对象有着原始对象属性值的一份精确拷贝。
若属性是基本类型,拷贝的就是基本类型的值;若属性是引用类型,拷贝就是存地址。
//二、浅拷贝
class Test{
public $a = 1;
}
class Test2{
public $b = 1;
public $obj;
//包含了一个对象属性,clone时,属于浅拷贝
public function __construct(){
$this->obj = new Test();
}
}
$m = new Test2();
$p = clone $m;//PHP clone是浅拷贝
$p->b = 2;
echo $m->b; // 1 改变普通属性,不会对源对象有影响
echo PHP_EOL;
$p->obj->a = 3;
echo $m->obj->a; // 3 改变对象属性,源对象中的a也改变
三、深拷贝(deep copy)
会拷贝所有属性,并拷贝属性指向的动态分配的内存,当对象和它所引用的对象一起拷贝时,发生深拷贝。深拷贝与浅拷贝相比,速度较慢,花销较大。
拷贝后两对象互不影响。
//三、深拷贝
class Test{
public $a = 1;
}
class Test2{
public $b = 1;
public $obj;
public function __construct(){
$this->obj = new Test();
}
//重写clone函数
public function __clone(){
$this->obj = clone $this->obj;
}
}
$m = new Test2();
$n = clone $m;
$n->b = 2;
echo $m->b; // 1 普通属性实现深拷贝,不会影响源对象
echo PHP_EOL;
$n->obj->a = 3;
echo $m->obj->a; //1 对新对象的改变,不会影响源对象