php物件導向Clone與序列化

來源:互聯網
上載者:User
對象的複製時有三種方案:

1,直接複製 $a = $b

這種是淺拷貝,當改變$a的時候$b也會改變,因為他們指向的是同一塊堆區

2,clone複製 $a = clone $b

這種拷貝貌似是深拷貝,當$a發生變化的時候$b不會跟著變化,同時PHP提供了魔術方法__Clone()可以自訂Clone複制,哪些屬性不想被複製,複製過程中需要哪些改變,都可以在__clone()方法中自訂。

但是這種複製的方法有個缺陷,需要注意,如果類中的某個屬性的類型是另外一個類,那麼在Clone的時候這個屬性會不會被深拷貝,是不是很尷尬,當然這點缺陷是可以通過魔術方法__clone來進行彌補的,在__clone()方法中為這個屬性new一個新的類就是了。

class test{private $name;private $sex;private $demo;public function __construct($name,$sex,$demo){$this->name = $name;$this->sex  = $sex;$this->demo = $demo;}public function __set($key,$value){$this->{$key} = $value;}public function __get($key){return $this->{$key};}public function __clone(){$this->name='null';  //這裡可以自訂clone}}
class demo{private $name;public function __construct($name='demo01'){$this->name = $name;}public function __set($key,$value){$this->{$key} = $value;}public function __get($key){return $this->{$key};}}
$t = new test('aa', 'bb',new demo('d01'));$d = clone $t;//$d->name='nihao';$d->demo->name = 'd02';var_dump($t);   //結果 $t->demo->name   d02
使用clone彌補

public function __clone(){$this->name='null';$this->demo = new demo('init');}

3,序列化複製

$b = unserialize(serialize($t));
這樣不需要使用clone魔術方法既可以實現屬性中參考型別的深拷貝了。

以上就介紹了php物件導向Clone與序列化,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.