亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

php中淺復制與深復制的例子

2024-09-04 11:43:48
字體:
來源:轉載
供稿:網友

前段時間頭一次聽說淺復制與深復制了,當時就是看的java例子,下文我來為各位分享一些小編總結的php中淺復制與深復制的例子供各位學習.

周末閑來無事看到了原型模式,其中談到了淺復制和深復制,想到PHP中的對應賦值、克隆以及克隆是淺復制還是深復制.

先來看看賦值,例如有一個簡歷類,有身高和體重兩個屬性:

  1. class Resume  
  2.  
  3.  
  4.     public $height
  5.  
  6.     public $weight
  7.  
  8.    
  9.  
  10.     public $workExperience
  11.  
  12.  
  13. $ResumeA = new Resume(); 
  14.  
  15. $ResumeB = $ResumeA

此時實例化了一個Resume類并賦值給了$ResumeA變量,然后將$ResumeA變量賦值給$ResumeB,PHP手冊上有說.

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

所以若通過$ResumeB修改height屬性,則$ResumeA也會跟著變,如果想要復制一個全新的對象,則可以通過clone來實現,如.

$ResumeB = clone $ResumeA;

此時將$ResumeA的值拷貝到新的變量$ResumeB中,改變其中一個不影響另一個,修改$ResumeB中height屬性,$ResumeA不會跟著改變。

但如果該類引用了其他對象,則所有的引用仍然指向到原來的對象。clone的這種復制方式就是淺復制。被賦值對象的所有變量都還有與原來對象相同的值,而所有的對其他對象的引用都仍然指向原來的對象。

如果上面類中workExperience為WorkExperience類的引用,當克隆的時候,克隆前后的workExperience屬性還是指向到同一個對象內容.

與淺復制對應的是深復制,深復制把引用對象的變量指向復制過的新對象,而不是原有的被引用的對象。

PHP中可以通過兩種方式來實現深復制,第一種是__clone魔術方法:

  1. public function __clone() 
  2.  
  3.  
  4.     $this->workExperience = new WorkExperience(); 
  5.  

深復制涉及深的層次,通過clone魔術方法實現需要知道有幾層然后對每一層依次實現。還有一種是可以通過序列化對象的方式,先將對象序列化之后再反序列化,如:

$ResumeB = unserialize(serialize($ResumeA));

clone還算常用的拷貝方式,整理的目的只是為了記錄一下clone是淺復制,需要注意一下對象的引用.

我們再舉一個更實用的例子來說明一下PHP clone這種淺拷貝帶來的后果:

  1. class testClass 
  2.    public $str_data
  3.    public $obj_data
  4. $dateTimeObj = new DateTime("2014-07-05"new DateTimeZone("UTC")); 
  5. $obj1 = new testClass(); 
  6. $obj1->str_data ="aaa"
  7. $obj1->obj_data = $dateTimeObj
  8. $obj2 = clone $obj1
  9. var_dump($obj1);    // str_data:"aaa"  obj_data:"2014-07-05 00:00:00"  //開源軟件:Vevb.com 
  10. var_dump($obj2);    // str_data:"aaa"  obj_data:"2014-07-05 00:00:00" 
  11. $obj2->str_data ="bbb"
  12. $obj2->obj_data->add(new DateInterval('P10D'));      //給$obj2->obj_date 的時間增加了10天 
  13. var_dump($obj1);     // str_data:"aaa"   obj_data:"2014-07-15 00:00:00"  !!!! 
  14. var_dump($obj2);     // str_data:"bbb"   obj_data:"2014-07-15 00:00:00" 
  15. var_dump($dateTimeObj)  // 2014-07-15 00:00:00" 

這一下可以更加清楚的看到問題了吧,一般來講,你用clone來復制對象,希望是把兩個對象徹底分開,不希望他們之間有任何關聯,但由于clone的shallow copy的特性,有時候會出現非你期望的結果,上面的例子中.

1) $obj1->obj_data =$dateTimeObj 這句話實際上是個引用類型的賦值. 還記得前面提到的PHP中對象直接的賦值是引用操作么?除非你用$obj1->obj_dat = clone $dataTimeObj!

2) $obj2 = clone $obj1 這句話生成了一個obj1對象的淺拷貝對象,并賦給obj2. 由于是淺拷貝,obj2中的obj_data也是對$dateTimeObj的引用!

3)$dateTimeObj, $obj1->obj_data, $obj2->obj_data 實際上是同一個內存區對象數據的引用,因此修改其中任何一個都會影響其他兩個!

如何解決這個問題呢?采用PHP中的 __clone方法 把淺拷貝轉換為深拷貝(這個方法給C++中的copy constructor概念上有些相似,但執行流程并不一樣).

  1. class testClass 
  2.  public $str_data
  3.  public $obj_data
  4.  public function __clone() { 
  5.    $this->obj_data = clone $this->obj_data; 
  6. $dateTimeObj = new DateTime("2014-07-05"new DateTimeZone("UTC")); 
  7. $obj1 = new testClass(); 
  8. $obj1->str_data ="aaa"
  9. $obj1->obj_data = $dateTimeObj
  10. $obj2 = clone $obj1
  11. var_dump($obj1);  // str_data:"aaa"  obj_data:"2014-07-05 00:00:00" //開源軟件:Vevb.com 
  12. var_dump($obj2);  // str_data:"aaa"  obj_data:"2014-07-05 00:00:00" 
  13. $obj2->str_data ="bbb"
  14. $obj2->obj_data->add(new DateInterval('P10D')); 
  15. var_dump($obj1);  // str_data:"aaa"  obj_data:"2014-07-05 00:00:00" 
  16. var_dump($obj2);  // str_data:"aaa"  obj_data:"2014-07-15 00:00:00" 
  17. var_dump($dateTimeObj);  //"2014-07-05 00:00:00" 

關于 __clone() , PHP官方的文檔:Once the cloing is complete, if a __clone() method is defined,then the newly created object’s __clone() method will be called,to allow any necessary properties that need to be changed.

按照這個定義,事實上__clone方法可以做很多事情,但我目前能想到的就只有把 淺拷貝變成深拷貝 這個場景的應用了,如果有其他用法,歡迎大家提出來.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品在线国产| 在线播放精品一区二区三区| 秋霞成人午夜鲁丝一区二区三区| 91在线视频九色| 久久久亚洲网站| 在线观看免费高清视频97| 91超碰caoporn97人人| 欧美在线视频一区| 日韩欧美极品在线观看| 久久影视三级福利片| 亚洲欧美精品中文字幕在线| 91国产精品91| 久久久久日韩精品久久久男男| 91av在线播放视频| 亚洲国产精品成人精品| 久久久女人电视剧免费播放下载| 日韩欧美成人区| 色中色综合影院手机版在线观看| 日韩高清中文字幕| 欧美性受xxx| www.欧美精品一二三区| 国产精品极品美女在线观看免费| 国产日产久久高清欧美一区| 欧美一区二粉嫩精品国产一线天| 国产91精品久久久| 久久精品99久久香蕉国产色戒| 日韩av影院在线观看| 亚洲国模精品私拍| 91精品在线播放| 日韩在线视频观看正片免费网站| 亚洲欧美国产精品专区久久| 亚洲第一在线视频| 国产精品成人av在线| 免费99精品国产自在在线| 亚洲欧洲自拍偷拍| 亚洲一区二区三区视频播放| 久久99青青精品免费观看| 美日韩在线视频| 日韩在线观看免费高清完整版| 少妇高潮久久77777| 久久精品视频免费播放| 亚洲 日韩 国产第一| 欧美二区乱c黑人| 中文字幕欧美精品在线| 欧美激情国产精品| 欧美在线视频观看免费网站| 亚洲аv电影天堂网| 国产日韩欧美中文在线播放| 亚洲人高潮女人毛茸茸| 久99久在线视频| 91精品国产91久久久久久不卡| 欧美成年人网站| 久久精品免费电影| 亚洲精品国产精品国自产观看浪潮| 亚洲国产成人在线播放| 永久555www成人免费| 色老头一区二区三区| 欧美精品久久久久久久久久| 国产精品av网站| 久久免费成人精品视频| 国产精品入口日韩视频大尺度| 亚洲一区亚洲二区| 亚洲欧美日韩精品| 亚洲成人网久久久| 91在线观看免费观看| 亚洲美腿欧美激情另类| 日韩一区二区欧美| 日韩av网站大全| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲人成亚洲人成在线观看| 91黑丝高跟在线| 国产婷婷成人久久av免费高清| 在线播放国产一区中文字幕剧情欧美| 亚洲一区二区三区乱码aⅴ| 7777精品久久久久久| 久久久国产精品亚洲一区| 亚洲成人网av| 久久91精品国产91久久跳| 国产福利精品av综合导导航| 中文字幕日韩欧美在线视频| 亚洲成人a级网| 18一19gay欧美视频网站| 精品国产一区二区三区久久| 亚州av一区二区| 久久久久久久电影一区| 成人免费视频网| 久久不射热爱视频精品| 日韩毛片在线看| 亚洲第一国产精品| 中文字幕国产亚洲2019| 欧美一区二区三区免费观看| 91sao在线观看国产| 国产主播精品在线| 26uuu国产精品视频| 国产免费一区二区三区在线观看| 亚洲欧美综合另类中字| 欧美一性一乱一交一视频| 成人av番号网| 最新亚洲国产精品| 亚洲欧美日韩中文视频| 黄色成人av在线| 懂色av中文一区二区三区天美| 日av在线播放中文不卡| 中文字幕一区日韩电影| 欧美日韩精品国产| 欧美在线激情视频| 日日噜噜噜夜夜爽亚洲精品| 国产人妖伪娘一区91| 国产精品美女在线| 亚洲欧美中文日韩在线| 日韩欧美在线免费观看| 国产欧美日韩视频| 性色av一区二区三区| 国产噜噜噜噜久久久久久久久| 国产亚洲激情视频在线| 韩国精品美女www爽爽爽视频| 欧美日韩亚洲精品内裤| 久久综合伊人77777蜜臀| 最新国产精品亚洲| 久国内精品在线| 亚洲国产精品福利| 日韩av电影中文字幕| 亚洲xxxx视频| 日韩免费观看视频| 亚洲最新av在线网站| 91性高湖久久久久久久久_久久99| 亚洲最大av在线| 亚洲国产精品久久久久秋霞不卡| 欧美精品一区二区免费| 欧美午夜女人视频在线| 搡老女人一区二区三区视频tv| 中文字幕精品一区二区精品| 久久国产色av| 欧美午夜无遮挡| 欧美疯狂xxxx大交乱88av| 久久久久久久久久久免费| 国产成人在线播放| 91成人在线播放| 欧美日韩高清在线观看| 欧美高跟鞋交xxxxhd| 中文字幕精品www乱入免费视频| 日韩在线观看视频免费| 美女久久久久久久久久久| 久久精品中文字幕| 欧美精品久久久久久久| 日本精品久久电影| 国产日韩欧美视频| 91精品视频在线播放| 日韩中文av在线| 亚洲成色www8888| 欧美天堂在线观看| 夜色77av精品影院| 亚洲欧美另类国产| 国产成人精品a视频一区www| 久久久成人精品| 久久久免费精品视频| 91po在线观看91精品国产性色| 久久久国产精品免费| 欧美性猛交xxxx免费看久久久| 国产精品精品视频| 久久伊人91精品综合网站| 深夜精品寂寞黄网站在线观看| 亚洲天堂男人的天堂| 日韩欧美在线一区|