php中赋值、浅拷贝与深拷贝
首先是菜鸟教程中Python中关于此的定义:
直接赋值:其实就是对象的引用(别名)。
浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
需要注意的是,浅拷贝时对于对象里的属性是值传递,而对于对象是引用传递。
而我们要做的深拷贝则是需要把值与对象都变成值传递
从php5开始,对象的赋值是引用传递,所下面所示:
class A{
public $name = "cate";
}
$a = new A();
$b = $a;
$a->name = 'king';
print_r($b->name); //输出:king
而使用关键字克隆clone
则是浅拷贝:
class foo{
public $a= 1;
}
class A{
public $name = "cate";
public $obj;
public function __construct()
{
$this->$obj = new foo();
}
}
$a = new A();
$b = clone $a;
$b->name = 'king';
print_r($a->name); //输出:cate
$b->obj->a = 2;
print_r($a->obj->a); //输出 :2
接下来是深拷贝,深拷贝需要对象里的属性和对象都是值传递
那么我们需要怎么做呢?
方法之一就是重写clone
方法。
class foo{
public $a= 1;
}
class A{
public $name = "cate";
public $obj;
public function __construct()
{
$this->$obj = new A();
}
public function __clone(){
$this->obj = clone $this->obj;
}
}
但是这样做并不优雅,但是对于理解概念还是蛮有帮助的,具体有哪些方法搜索会有一堆,在此就不多说。
评论已关闭