* 物件的複製與複製
* 1.預設情況下,物件是引用傳遞(實際上是物件識別符的複製,後面會詳細說)
* 2.也就是說二個物件變數其實是引用的是同一個物件
* 3.如果要建立一個新的物件,必須使用clone關鍵字來複製目前物件
* 4 .當使用clone關鍵字時,如果類別中有__clone()會自動呼叫
* 5.__clone()方法運行在新建立的物件上面
* 6.__clone( )方法能控制我們複製什麼,以及複製時要完成的基本操作
class Member { //声明三个私有属性 private $name; //会员名 private $email; //会员邮箱 private $score; //会员积分 //构造方法 public function __construct($name='',$email='',$score=0) { $this->name = $name; $this->email = $email; $this->score = $score; } //查询器(暂时省略访问控制) public function __get($name) { return $this->$name; } //设置器(暂时省略访问控制) public function __set($name,$value) { $this->$name = $value; } //克隆魔术方法在对象克隆时自动调用,针对新对象进行初始化操作 public function __clone() { $this->score = 0; } }
//實例化會員類別Member,建立會員物件$member
$member = new Member('peter','peter@php.cn',1000);
//存取測試
#echo $member->score;
//複製會員物件
$member1 = $member;
//使用新變數名稱$member1來更新物件資訊
$member1->score = 2000;
//用新物件變數名稱$member1存取
echo $member1->score; echo '<hr>';
//用原物件物件名稱$member存取
echo $member->score;
* 結論:
* 1.新變數修改的結果反映了原始物件變數中
# * 2 .說明這二個變數,實際上指向的是同一個物件
* 3.也就是物件預設是引用傳遞
* 4.或者說,第二個變數名稱$member1只是原變數的別名,並沒創建新物件
* 5.可以理解為僅僅是將原始物件的識別碼,重新起了一個新名稱罷了
var_dump($member1); //对象id=1 var_dump($member); //对象id=1
//說明$ member1和$member是二個完全一樣的物件,僅僅是名稱不同罷了
//如果想完全創建一個全新的物件應該如何做呢?需要使用關鍵字:clone
$member2 = clone $member;
//我們先來看看物件變數$member2的score屬性值
echo $member2->score; //目前是原始值2000
//修改score值
$member2->score = 5000; echo '<hr>';
//再次檢視$member2中的score
echo $member2->score; //新值5000 echo '<hr>';
//大家想一下,我的這種修改,會不會影響到原$member變數的score屬性值呢?
echo $member->score; //发现原对象的score属性值仍为2000,未发生变化
//這是為什麼呢?因為我們使用了克隆技術,創建了二個完全不同的物件變數
//下面進行驗證
var_dump($member); //变量id是1 var_dump($member2); //变量id是2
//這二個物件變數的id是不同的,說明是二個完全不同的物件
//下面完成這樣的一個任務:創建新的會員物件的時候,將該會員的積分清零?應該怎麼做?
//在Memeber類別中創建一個__clone()克隆魔術方法,對克隆出的新物件進行預處理
//再示範一次
//檢視目前會積分
echo $member->score;
//複製建立一個全新的對象$member3
$member3 = clone $member;
//查看新物件$member3的score值,以驗證類別中的__clone()是否生效?
echo '<hr>'; echo $member3->score; //0,说明克隆魔术方法已经生效
以上是php中物件的複製與克隆的詳細內容。更多資訊請關注PHP中文網其他相關文章!