php克隆对象及__clone关键字demo

 当在一个Person对象上调用clone时,产生了一个新的副本,并且新副本的__clone()方法被调用。这意味着我们在__clone()中重新赋值会生效。这样的浅复制可以保证所有的基本类型的属性被完全复制。在复制对象属性时只复制引用,并不复制引用对象。

在下面的例子中,当新创建副本时,新对象中所保存的引用指向的是和$person所引用的同一个Account对象。当我们给$person的Account属性加钱,发现$person2对象中的余额也增加了。

如果我们不希望对象属性在复制之后被共享,那么可以显式的在__clone()方法中复制指向的对象

function __clone(){
    $this->id=0;
    $this->account=clone $this->account;
}
<?php
class Account{
	public $balance;
	function __construct($blance){
		$this->balance=$blance;
	}
}

class Person{
	private $name;
	private $age;
	private $id;
	
	public $account;
	
	function __construct($name,$age,Account $account){
		$this->name=$name;
		$this->age=$age;
		$this->account=$account;
	}
	function setId($id){
		$this->id=$id;
	}
	function __clone(){
		$this->id=0;
		//不加这一行,person对象的账户是所有对象共享的,
		//加了这一行person对象的账号不能被克隆
		//$this->account=clone $this->account;
	}
}

$person=new Person("Lili",21,new Account(200));
$person->setId(33);

$person2=clone $person;

$person->account->balance+=10000;
print $person2->account->balance;



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值