最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年10月26日 11:39:43   作者:我是大愚  
這篇文章主要介紹了PHP中的淺復制與深復制的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下

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

前言:

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

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

這里舉個栗子:

class Example1
{
  public $name;

  public function __construct($name)
  {
    $this->name = $name;
  }
}

$ex1 = new Example('test1');// $ex1->name現(xiàn)在是:test1
$ex2 = $ex1;// $ex2->name現(xiàn)在是:test1

$ex2->name = 'test2';// 這樣修改一下之后,$ex1->name與$ex2->name都變?yōu)榱耍簍est2

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

$ex1 = new Example('test1');// $ex1->name現(xiàn)在是:test1
$ex2 = clone $ex1;//$ex2->name現(xiàn)在是:test1

$ex2->name = 'test2';//現(xiàn)在$ex1->name還是test1,而$ex2->name是test2

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

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

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

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

方式一:利用__clone方法

public function __clone()
{
  $this->obj = new Obj();
}

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

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

$tmp = serialize($ex1);
$ex2 = unserialize($tmp);

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

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

如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • PHP操作XML中XPath的應用示例

    PHP操作XML中XPath的應用示例

    這篇文章主要介紹了PHP操作XML中XPath的應用,結(jié)合實例形式分析了php使用XPath進行xml節(jié)點查詢的相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • php 利用socket發(fā)送HTTP請求(GET,POST)

    php 利用socket發(fā)送HTTP請求(GET,POST)

    作為php程序員一定會接觸http協(xié)議,也只有深入了解http協(xié)議,編程水平才會更進一步。最近我一直在學習php的關(guān)于http的編程,許多東西恍然大悟,受益匪淺。希望分享給大家。本文需要有一定http基礎(chǔ)的開發(fā)者閱讀。
    2015-08-08
  • php實現(xiàn)圖片以base64顯示的方法

    php實現(xiàn)圖片以base64顯示的方法

    這篇文章主要介紹了php實現(xiàn)圖片以base64顯示的方法,較為詳細的分析了base64編碼格式顯示圖片的相關(guān)實現(xiàn)技巧與注意事項,需要的朋友可以參考下
    2016-10-10
  • PHP基于工廠模式實現(xiàn)的計算器實例

    PHP基于工廠模式實現(xiàn)的計算器實例

    這篇文章主要介紹了PHP基于工廠模式實現(xiàn)的計算器,實例分析了php工廠模式的實現(xiàn)原理與應用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 解析PHP中的unset究竟會不會釋放內(nèi)存

    解析PHP中的unset究竟會不會釋放內(nèi)存

    PHP中的unset究竟會不會釋放內(nèi)存?以下我們實例說明一下
    2013-07-07
  • Discuz Uchome ajaxpost小技巧

    Discuz Uchome ajaxpost小技巧

    discuz的ajaxpost功能有點強大,但缺點也很明顯,如果ajaxpost提交一個FORM,那么返回的時候只能顯示showmessage的內(nèi)容,而不會主動跳轉(zhuǎn),因此這里就有一個小技巧 了。
    2011-01-01
  • PHP多個圖片壓縮成ZIP的方法

    PHP多個圖片壓縮成ZIP的方法

    這篇文章主要為大家詳細介紹了PHP多個圖片壓縮成ZIP的方法,可將多個文件壓縮成一個zip壓縮包,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Ubuntu12下編譯安裝PHP5.3開發(fā)環(huán)境

    Ubuntu12下編譯安裝PHP5.3開發(fā)環(huán)境

    本文給大家分享的是在Ubuntu12下編譯安裝PHP5.3開發(fā)環(huán)境的方法和步驟,十分的細致,推薦給大家,有需要的小伙伴們可以參考下。
    2015-03-03
  • php三種實現(xiàn)多線程類似的方法

    php三種實現(xiàn)多線程類似的方法

    這篇文章主要介紹了php三種實現(xiàn)多線程類似的方法,需要的朋友可以參考下
    2015-10-10
  • php文件上傳后端處理小技巧

    php文件上傳后端處理小技巧

    這篇文章主要為大家詳細介紹了php文件上傳后端處理小技巧,幫助大家更好的進行文件上傳操作,感興趣的朋友可以參考一下
    2016-05-05

最新評論

沧源| 霍邱县| 怀化市| 分宜县| 金溪县| 景德镇市| 合山市| 大宁县| 二连浩特市| 满城县| 章丘市| 象山县| 开鲁县| 高碑店市| 堆龙德庆县| 通山县| 自治县| 延长县| 肇庆市| 喀喇沁旗| 明星| 海兴县| 通化县| 凯里市| 泗水县| 山东省| 万山特区| 建宁县| 无锡市| 仁布县| 漳浦县| 水富县| 黑山县| 公安县| 达州市| 吉林省| 沙雅县| 元阳县| 永济市| 南城县| 荔浦县|