前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php中赋值、浅拷贝与深拷贝

php中赋值、浅拷贝与深拷贝

作者头像
槽痞
发布2020-07-29 11:54:53
8880
发布2020-07-29 11:54:53
举报

首先是菜鸟教程中Python中关于此的定义:

代码语言:javascript
复制
直接赋值:其实就是对象的引用(别名)。

浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

需要注意的是,浅拷贝时对于对象里的属性是值传递,而对于对象是引用传递

从php5开始,对象的赋值是引用传递,所下面所示:

代码语言:javascript
复制
class A{
  public $name = "cate";
}

$a = new A();
$b = $a;
$a->name = 'king';
print_r($b->name); //输出:king

而使用关键字克隆clone则是浅拷贝:

代码语言:javascript
复制
class foo{
  public $a= 1;
}
class A{
   public $name = "cate";
   public $obj;
   
    public function __construct()
    {
      $this->$obj = new A();
    }

}

$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方法。

代码语言:javascript
复制
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;
    }

}

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档