php 克隆对象,php中对象的复制与克隆
* 對象的復制與克隆
* 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 '
';
//用原對象對象名$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 '
';
//再次查看$member2中的scoreecho $member2->score; //新值5000
echo '
';
//大家想一下,我的這種修改,會不會影響到原$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 '
';
echo $member3->score; //0,說明克隆魔術方法已經生效
總結
以上是生活随笔為你收集整理的php 克隆对象,php中对象的复制与克隆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ELF文件详解—初步认识
- 下一篇: php copy array,ES6中A