PHP使用clone关键字复制对象

本文介绍了PHP中对象复制的方法,包括浅复制与深复制的区别。详细解释了如何使用关键字clone进行对象复制,并展示了如何通过__clone()方法实现定制化的复制过程。此外,还探讨了序列化与反序列化作为深复制的一种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.关键字clone

class testClass {
    public $attr1;
    public $attr2;
}

$obj = new testClass();
$obj -> attr1 = 'a';
$obj -> attr2 = 'b';

$copy_obj = $obj;
## 使用关键字clone可以完成对对象的复制 ##
$copy_obj_new = clone $obj;

var_dump($obj);
var_dump($copy_obj);
var_dump($copy_obj_new);

打印结果为:
这里写图片描述

$obj -> attr1 = 'c';

var_dump($obj);
var_dump($copy_obj);
var_dump($copy_obj_new);

打印结果为:
这里写图片描述

实例化对象后的赋值引用赋值,使用关键字clone可以完成对对象的复制得到新的独立的对象

2. __clone() 方法

使用关键字 clone 克隆一个对象,新创建的对象(复制生成的对象)中的 __clone() 方法会被调用

class testClass {
    public $attr1;
    public $attr2;
    public function __clone() {
        $this -> attr1 = 'x';
    }
}

$obj = new testClass();
$obj -> attr1 = 'a';
$obj -> attr2 = 'b';
var_dump($obj);
$copy_obj_new = clone $obj;
var_dump($copy_obj_new);

打印结果如下:
这里写图片描述

3.浅复制与深复制

class newClass {
    public $newAttr = 'm';
}
class testClass {
    public $attr1;
    public $attr2;
}

$obj = new testClass();
$obj -> attr1 = 'a';
$obj -> attr2 = new newClass();
var_dump($obj);

$copy_obj_new = clone $obj;
$copy_obj_new -> attr1 = 'b';
$copy_obj_new -> attr2 -> newAttr = 'n';
var_dump($obj);
var_dump($copy_obj_new);

打印结果:
这里写图片描述

clone后属性值为非对象时,复制前后是独立的,没有相互影响。属性值为对象时,对象的属性值仍然指向同一个变量(我所理解的浅复制)

有两种方法解决上述问题,一种是使用__clone()方法,另一种是序列与反序列

public function __clone () {
    $this -> attr2 = clone new newClass();
}

这个方法属性值为对象太多的话,就要一个个的添加,可能会死人。

上述代码:$copy_obj_new = clone $obj;替换为下面的代码

$copy_obj_new = unserialize(serialize($obj));

打印结果:
这里写图片描述

各变量之间完全没有影响了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值