国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP中的淺復制與深復制的實例詳解

2024-05-04 21:50:08
字體:
來源:轉載
供稿:網友

前言:最近溫習了一下Design Pattern方面的知識,在看到Prototype Pattern這一設計模式時,注意到其中涉及到一個淺復制與深復制的問題。這里來總結一下,提醒自己以后一定要多加注意。

自PHP5起,new運算符自動返回一個引用,一個 對象變量 已經不再保存整個對象的值,只是保存一個標識符來訪問真正的對象內容。當對象作為參數傳遞,作為結果返回,或者賦值給另外一個變量,另外一個變量跟原來的不是引用的關系,只是他們都保存著同一個標識符的拷貝,這個標識符指向同一個對象的真正內容。

這里舉個栗子:

  1. class Example1 
  2.   public $name
  3.   
  4.   public function __construct($name
  5.   { 
  6.     $this->name = $name
  7.   } 
  8.   
  9. $ex1 = new Example('test1');// $ex1->name現在是:test1 
  10. $ex2 = $ex1;// $ex2->name現在是:test1 
  11.   
  12. $ex2->name = 'test2';// 這樣修改一下之后,$ex1->name與$ex2->name都變為了:test2 

通過上面這個例子,應該可以理解對象間引用的概念了,那么我們繼續往下走,在php中提供了 clone 這個關鍵字來進行對象復制,還是用上面的類來演示一下:

  1. $ex1 = new Example('test1');// $ex1->name現在是:test1 
  2. $ex2 = clone $ex1;//$ex2->name現在是:test1 
  3. $ex2->name = 'test2';//現在$ex1->name還是test1,而$ex2->name是test2 

這里看到,通過clone之后,$ex1與$ex2是兩個不同的對象,他們擁有各自的變量環境。但是這里需要注意,在這兩個對象內部,擁有的是值類型的數據,如果是內部擁有的是引用類型,那么通過clone得到的新對象中的引用則仍然指向原引用。這里就引申出 淺復制 與 深復制 的概念:

淺復制: 使用clone來復制對象,這種復制叫做“淺復制“,被賦值對象的所有變量都還有與原來對象相同的值,而所有的對其他對象的引用都仍然指向原來的對象。

深復制:被復制的對象的所有的變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。

默認使用 clone 是進行一個淺復制,那么如何才能進行深復制呢?

方式一:利用__clone方法

  1. public function __clone(){ 
  2.   $this->obj = new Obj(); 

這種方式非常直觀,但是卻有一個很麻煩的操作方式,就是當類中包含多個引用時,你就需要在__clone方法中逐個重新設置。而且還要處理一些循環引用的問題。是很復雜的。

方式二:利用串行化(冷藏與解凍)

$tmp = serialize($ex1);

$ex2 = unserialize($tmp);

這時候得到的$ex2就是一個全新的對象,這個過程在java中也叫作”冷藏“與”解凍“過程。

序列化是一個遞歸的過程,我們不需要理會被對象內部引用了多少個對象以及引用了多少層對象,我們都可以徹底的復制。方式二真的很黃很暴力,但是我很喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 内乡县| 盈江县| 青河县| 老河口市| 山丹县| 河源市| 姜堰市| 棋牌| 宁阳县| 凤庆县| 怀仁县| 台江县| 磐石市| 浦江县| 铜山县| 乌兰浩特市| 海兴县| 通榆县| 青川县| 济阳县| 嘉定区| 都兰县| 信丰县| 华池县| 桐城市| 会昌县| 广饶县| 泰和县| 保康县| 万山特区| 西乌| 宽甸| 辰溪县| 册亨县| 沾化县| 舟山市| 应城市| 习水县| 隆化县| 奉贤区| 和顺县|