当在一个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;