php中物件的複製與克隆

无忌哥哥
發布: 2023-04-01 21:20:02
原創
2396 人瀏覽過

* 物件的複製與複製

 * 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 &#39;<hr>&#39;;
登入後複製

//用原物件物件名稱$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 &#39;<hr>&#39;;
登入後複製

//再次檢視$member2中的score

echo $member2->score; //新值5000
echo &#39;<hr>&#39;;
登入後複製

//大家想一下,我的這種修改,會不會影響到原$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 &#39;<hr>&#39;;
echo $member3->score; //0,说明克隆魔术方法已经生效
登入後複製

以上是php中物件的複製與克隆的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!