首先是菜鸟教程中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;
    }

}

但是这样做并不优雅,但是对于理解概念还是蛮有帮助的,具体有哪些方法搜索会有一堆,在此就不多说。

标签: none

评论已关闭