###序言 咱们这里讨论的Clone
是指的 PHP5 以后的版本。PHP5 以后 若是这样复制对象是将指向对象的引用进行复制。php
$p1=new Person();
$p2=$p1;
复制代码
而使用clone
关键字则是对对象的实际内存内容进行复制,至关于从新开辟了一个内存块和一个指向该内存块的引用。bash
$p3=clone $p1;
复制代码
在实际场景中有时候不但愿对内存中的内容彻底的进行复制,这里 PHP 提供了一个内置的函数__clone()
,该函数在对象进行克隆时会自动调用,这里须要特别注意的是,__clone()
函数做用域里的$this
关键字指代的是***克隆后产生的对象***,而不是被克隆的对象,下面用代码来演示一下。函数
###实例学习
class Person{
private $name='yang';
private $age=18;
public function setName($name){
$this->name=$name;
}
function __clone() {
$this->name='xiaoming';
}
}
$p1=new Person();
$p2=$p1;
$p3=clone $p1;
echo 'Before $p1 change';
var_dump($p1);
var_dump($p2);
var_dump($p3);
$p1->setName('yang1');
echo 'After $p1 change';
var_dump($p1);
var_dump($p2);
var_dump($p3);
复制代码
查看运行结果:this
咱们能够看到在对象$p1
改变以后对象$p2
也相应的改变了,这是由于$p1
,$p2
两个变量只是指向对象内存的引用,这里学习过C语言的应该已经清楚了,就跟C语言的指针相似。而当保存对象真正的内存里面的内容改变后,咱们经过$p1
,$p2
这两个引用去访问的其实同一个内容,固然获得的内容是同样的,同时咱们看到$p3
的值在$p1
变化后并无发生变化。spa
这里$p3
变量若是Person
类里面没有__clone()
方法,其指向的内存块里面包含的内容实际上是和$p1
是同样的(注意不是内存块同样,是两个不一样的内存块里面包含的数据同样),在加了__clone()
方法后,咱们发如今克隆$p1
后$p3
内存内的name
属性已经变成了xiaoming
。指针
可能语言表示的不是太清楚,下面用图来表示一下。code
###小结对象
在PHP中赋值的默认复制方法是引用的复制,当咱们有的时候不想在两个复制的对象之间共用某一属性(或者对象)时,咱们就可使用clone
关键字,这样就至关于给复制出来的新对象从新开辟了一个内存块,对新旧两个对象的相关属性(或者对象)操做就不会相互影响了。ip