PHP中的深拷贝和浅拷贝

一、赋值(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 对新对象的改变,不会影响源对象
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容