###序言 咱們這裏討論的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