PHP中clone

php中的clone与我们前面讲的对象的赋值不一样PHP中类对象的深入

在使用clone语法之后会将在创建一个新的对象资源: 

Class A{
	public $p1=1;
}
$o1=new A();
$o1->p1=10;
$o2=clone $o1;
echo "$o1->p1<br/>";
echo "$o2->p1<br/>";
var_dump($o1);
echo "<br/>";
var_dump($o2);

此时o2将o1的内容完全赋值下来,但是其对象标识符改变了(相当于创建了一个独立的完全与o1相同的对象,只不过系统内部定义的标识符改变)。


注意:clone分为深度克隆浅克隆浅克隆如我们上面讲到的,下面讲解深度克隆。

深度克隆:即对象中的“对象和资源数据”都能克隆:

Class A{
	public $p1=1;
}
Class B{
	public $a1=1;
	public $b1;
	function __construct(){
	$this->b1=new A();
	}
}
$o1=new B();
$o2=clone $o1;
var_dump($o1);
echo "<br/>";
var_dump($o2);

我们可以发现:虽然o2对o1克隆之后的标识符改变了(相当于两个不同的对象了)但是其内部的对象资源的标识符还是一样的

也就是说clone不能克隆对象内部的“对象和资源数据”。这就称为浅克隆。

解决办法:因为在克隆的时候自动调用系统中的__clone()方法。此时我们可以在类中自定义一个__clone()方法。当克隆该类的对象时,会自动调用该类中我们自定义的克隆方法。因此,我们可以再自定义的__clone()方法内部再次克隆objiec(A)。

Class A{
	public $p1=1;
}
Class B{
	public $a1=1;
	public $b1;
	function __construct(){
	$this->b1=new A();
	}
	function __clone(){
		$this->b1=clone $this->b1;
	}
}
$o1=new B();
$o2=clone $o1;
var_dump($o1);
echo "<br/>";
var_dump($o2);

此时我们可以发现o1和o2中的objiec(A)有不同的标识符,符合对克隆的定义。此时完成了完全克隆。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值