php面向对象编程之关键字 clone

本文介绍了PHP中如何使用关键字clone来复制对象,并解释了__clone()方法的作用。同时对比了浅复制与深复制的区别,提供了两种解决对象属性深复制问题的方法。

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

对象也能被“克隆”

在php5中,对象的传递方式默认为引用传递,如果我们想要在内存中生成两个一样的对象或者创建一个对象的副本,这时可以使用“克隆”。

通过 clone 克隆一个对象

对象的复制是通过关键字 clone 来实现的。用 clone 克隆出来的对象与原对象没有任何关系,它是把原来的对象从当前的位置重新复制了一份,也就是相当于在内存中新开辟了一块空间。通过关键字 clone 可以克隆一个对象,语法格式如下:


$克隆对象名称=clone $原对象名称;

__clone()方法 

对象的__clone()方法不能够直接被调用,只有当通过关键字 clone 克隆一个对象时才可以使用该对象调用__clone()方法。当创建对象的一个副本时,php5将会检查__clone()方法是否存在。如果不存在,那 么它就会调用默认的__clone()方法,复制对象的所有属性。如果__clone方法已经定义过,那么__clone()方法就会负责设置新对象的属 性。所以在__clone()方法中,只需要覆盖那些需要更改的属性就可以了。例子如下:


class MyClone{
    public function __clone(){
        echo"对象已被克隆";
    }
}
$objectA=new MyClone();
$objectB=$objectA;  //不调用__clone()方法,没任何输出
$objectC=clone $objectA;  //调用__clone()方法

浅复制与深复制

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));

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

文章原地址:https://blog.youkuaiyun.com/sinat_29091823/article/details/72637192

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值