面向對象PHP之Clone對象

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

clone1

咱們能夠看到在對象$p1 改變以後對象$p2也相應的改變了,這是由於$p1,$p2兩個變量只是指向對象內存的引用,這裏學習過C語言的應該已經清楚了,就跟C語言的指針相似。而當保存對象真正的內存裏面的內容改變後,咱們經過$p1,$p2這兩個引用去訪問的其實同一個內容,固然獲得的內容是同樣的,同時咱們看到$p3的值在$p1變化後並無發生變化。spa

這裏$p3變量若是Person類裏面沒有__clone()方法,其指向的內存塊裏面包含的內容實際上是和$p1是同樣的(注意不是內存塊同樣,是兩個不一樣的內存塊裏面包含的數據同樣),在加了__clone()方法後,咱們發如今克隆$p1$p3內存內的name屬性已經變成了xiaoming指針

可能語言表示的不是太清楚,下面用圖來表示一下。code

clone2

###小結對象

在PHP中賦值的默認複製方法是引用的複製,當咱們有的時候不想在兩個複製的對象之間共用某一屬性(或者對象)時,咱們就可使用clone關鍵字,這樣就至關於給複製出來的新對象從新開闢了一個內存塊,對新舊兩個對象的相關屬性(或者對象)操做就不會相互影響了。ip

相關文章
相關標籤/搜索