* 1.默認情況下,對象是引用傳遞(實際上是對象標識符的復(fù)制,后面會詳細說)
* 2.也就是說二個對象變量實際上是引用的是同一個對象
* 3.如果要創(chuàng)建一個新的對象,必須使用clone關(guān)鍵字來克隆當(dāng)前對象
* 4.當(dāng)使用clone關(guān)鍵字時,如果類中有__clone()會自動調(diào)用
* 5.__clone()方法運行在新創(chuàng)建的對象上面
* 6.__clone()方法能控制我們復(fù)制什么,以及克隆時要完成的基本操作
html' target='_blank'>class Member //聲明三個私有屬性 private $name; //會員名 private $email; //會員郵箱 private $score; //會員積分 //構(gòu)造方法 public function __construct($name= ,$email= ,$score=0) $this- name = $name; $this- email = $email; $this- score = $score; //查詢器(暫時省略訪問控制) public function __get($name) return $this- $name; //設(shè)置器(暫時省略訪問控制) public function __set($name,$value) $this- $name = $value; //克隆魔術(shù)方法在對象克隆時自動調(diào)用,針對新對象進行初始化操作 public function __clone() $this- score = 0;}
//實例化會員類Member,創(chuàng)建會員對象$member
$member = new Member( peter , peter@VeVb.com ,1000);
//訪問測試
echo $member- score;
//復(fù)制會員對象
$member1 = $member;
//使用新變量名$member1來更新對象信息
$member1- score = 2000;
//用新對象變量名$member1訪問
echo $member1- score;echo hr
//用原對象對象名$member訪問
echo $member- score;
* 結(jié)論:
* 1.新變量修改的結(jié)果反映到了原對象變量中
* 2.說明這二個變量,實際上指向的是同一個對象
* 3.也就是對象默認是引用傳遞
* 4.或者說,第二個變量名$member1只是原變量的別名,并沒創(chuàng)建新對象
* 5.可以理解為僅僅是將原對象的標識符,重新起了一個新名稱罷了
var_dump($member1); //對象id=1var_dump($member); //對象id=1
//說明$member1和$member是二個完全一樣的對象,僅僅是名稱不同罷了
//如果想完全創(chuàng)建一個全新的對象應(yīng)該如何做呢?需要使用關(guān)鍵字:clone
$member2 = clone $member;
//我們先查看一下對象變量$member2的score屬性值
echo $member2- score; //目前是原始值2000
//修改score值
$member2- score = 5000;echo hr
//再次查看$member2中的score
echo $member2- score; //新值5000echo hr
//大家想一下,我的這種修改,會不會影響到原$member變量的score屬性值呢?
echo $member- score; //發(fā)現(xiàn)原對象的score屬性值仍為2000,未發(fā)生變化
//這是為什么呢?因為我們使用了克隆技術(shù),創(chuàng)建了二個完全不同的對象變量
//下面進行驗證
var_dump($member); //變量id是1var_dump($member2); //變量id是2
//這二個對象變量的id是不同的,說明是二個完全不同的對象
//下面完成這樣的一個任務(wù):創(chuàng)建新的會員對象的時候,將該會員的積分清零?應(yīng)該怎么做?
//在Memeber類中創(chuàng)建一個__clone()克隆魔術(shù)方法,對克隆出的新對象進行預(yù)處理
//再演示一遍
//查看當(dāng)前會積分
echo $member- score;
//克隆創(chuàng)建一個全新的對象$member3
$member3 = clone $member;
//查看新對象$member3的score值,以驗證類中的__clone()是否生效?
echo hr echo $member3- score; //0,說明克隆魔術(shù)方法已經(jīng)生效
以上就是php中對象的復(fù)制與克隆的詳細內(nèi)容,PHP教程
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。
新聞熱點
疑難解答
圖片精選