站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

php中深拷貝和淺拷貝的區(qū)別是什么

PHP中深拷貝和淺拷貝的區(qū)別:1、深拷貝賦值時(shí)是完全復(fù)制,而淺拷貝只是引用賦值,相當(dāng)于取了一個(gè)別名;2、深拷貝若對(duì)其中一個(gè)做出改變不會(huì)影響另一個(gè),而淺拷貝對(duì)其中一個(gè)進(jìn)行修改會(huì)影響另一個(gè)。

php中深拷貝和淺拷貝的區(qū)別是什么

本教程操作環(huán)境:windows10系統(tǒng)、PHP7.1版、DELL G3電腦

php中深拷貝和淺拷貝的區(qū)別是什么

先說(shuō)一下深拷貝和淺拷貝通俗理解

深拷貝:賦值時(shí)值完全復(fù)制,完全的copy,對(duì)其中一個(gè)作出改變,不會(huì)影響另一個(gè)

淺拷貝:賦值時(shí),引用賦值,相當(dāng)于取了一個(gè)別名。對(duì)其中一個(gè)修改,會(huì)影響另一個(gè)

PHP中, = 賦值時(shí),普通對(duì)象是深拷貝,但對(duì)對(duì)象來(lái)說(shuō),是淺拷貝。也就是說(shuō),對(duì)象的賦值是引用賦值。(對(duì)象作為參數(shù)傳遞時(shí),也是引用傳遞,無(wú)論函數(shù)定義時(shí)參數(shù)前面是否有&符號(hào))

php4中,對(duì)象的 = 賦值是實(shí)現(xiàn)一份副本,這樣存在很多問(wèn)題,在不知不覺(jué)中我們可能會(huì)拷貝很多份副本。

php5中,對(duì)象的 = 賦值和傳遞都是引用。要想實(shí)現(xiàn)拷貝副本,php提供了clone函數(shù)實(shí)現(xiàn)。

clone完全copy了一份副本。但是clone時(shí),我們可能不希望copy源對(duì)象的所有內(nèi)容,那我們可以利用__clone來(lái)操作。

在__clone()中,我們可以進(jìn)行一些操作。注意,這些操作,也就是__clone函數(shù)是作用于拷貝的副本對(duì)象上的

<?php //普通對(duì)象賦值,深拷貝,完全值復(fù)制 $m = 1; $n = $m; $n = 2; echo $m;//值復(fù)制,對(duì)新對(duì)象的改變不會(huì)對(duì)m作出改變,輸出 1.深拷貝 echo PHP_EOL; /*==================*/   //對(duì)象賦值,淺拷貝,引用賦值 class Test{     public $a=1; } $m = new Test(); $n = $m;//引用賦值 $m->a = 2;//修改m,n也隨之改變 echo $n->a;//輸出2,淺拷貝 echo PHP_EOL; ?>

  由于對(duì)象的賦值時(shí)引用,要想實(shí)現(xiàn)值復(fù)制,php提供了clone函數(shù)來(lái)實(shí)現(xiàn)復(fù)制對(duì)象。

但是clone函數(shù)存在這么一個(gè)問(wèn)題,克隆對(duì)象時(shí),原對(duì)象的普通屬性能值復(fù)制,但是源對(duì)象的對(duì)象屬性賦值時(shí)還是引用賦值,淺拷貝。

<?php class Test{     public $a=1; }   class TestOne{     public $b=1;     public $obj;     //包含了一個(gè)對(duì)象屬性,clone時(shí),它會(huì)是淺拷貝     public function __construct(){         $this->obj = new Test();     } } $m = new TestOne(); $n = $m;//這是完全的淺拷貝,無(wú)論普通屬性還是對(duì)象屬性   $p = clone $m;   //普通屬性實(shí)現(xiàn)了深拷貝,改變普通屬性b,不會(huì)對(duì)源對(duì)象有影響 $p->b = 2; echo $m->b;//輸出原來(lái)的1 echo PHP_EOL;   //對(duì)象屬性是淺拷貝,改變對(duì)象屬性中的a,源對(duì)象m中的對(duì)象屬性中a也改變   $p->obj->a = 3; echo $m->obj->a;//輸出3,隨新對(duì)象改變 ?>

  要想實(shí)現(xiàn)對(duì)象真正的深拷貝,有下面兩種方法:

寫(xiě)clone函數(shù):如下

<?php class Test{     public $a=1; }   class TestOne{     public $b=1;     public $obj;     //包含了一個(gè)對(duì)象屬性,clone時(shí),它會(huì)是淺拷貝     public function __construct(){         $this->obj = new Test();     }           //方法一:重寫(xiě)clone函數(shù)     public function __clone(){         $this->obj = clone $this->obj;     } }   $m = new TestOne(); $n = clone $m;   $n->b = 2; echo $m->b;//輸出原來(lái)的1 echo PHP_EOL; //可以看到,普通屬性實(shí)現(xiàn)了深拷貝,改變普通屬性b,不會(huì)對(duì)源對(duì)象有影響   //由于改寫(xiě)了clone函數(shù),現(xiàn)在對(duì)象屬性也實(shí)現(xiàn)了真正的深拷貝,對(duì)新對(duì)象的改變,不會(huì)影響源對(duì)象 $n->obj->a = 3; echo $m->obj->a;//輸出1,不隨新對(duì)象改變,還是保持了原來(lái)的屬性   ?>

  改寫(xiě)__clone()函數(shù)不太方便,而且你得在每個(gè)類(lèi)中把這個(gè)類(lèi)里面的對(duì)象屬性都在__clone()中 一一 clone

第二種方法,利用序列化反序列化實(shí)現(xiàn),這種方法實(shí)現(xiàn)對(duì)象的深拷貝簡(jiǎn)單,不需要修改類(lèi)

<?php class Test{     public $a=1; }   class TestOne{     public $b=1;     public $obj;     //包含了一個(gè)對(duì)象屬性,clone時(shí),它會(huì)是淺拷貝     public function __construct(){         $this->obj = new Test();     }       }   $m = new TestOne(); //方法二,序列化反序列化實(shí)現(xiàn)對(duì)象深拷貝 $n = serialize($m); $n = unserialize($n);   $n->b = 2; echo $m->b;//輸出原來(lái)的1 echo PHP_EOL; //可以看到,普通屬性實(shí)現(xiàn)了深拷貝,改變普通屬性b,不會(huì)對(duì)源對(duì)象有影響     $n->obj->a = 3; echo $m->obj->a;//輸出1,不隨新對(duì)象改變,還是保持了原來(lái)的屬性,可以看到,序列化和反序列化可以實(shí)現(xiàn)對(duì)象的深拷貝   ?>

 還有第三種方法,其實(shí)和第二種類(lèi)似,json_encode之后再json_decode,實(shí)現(xiàn)賦值 

推薦學(xué)習(xí):《PHP視頻教程》

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
国内精品免费久久影院| 亚洲欧美日韩中文二区| 99re在线这里只有精品| 在线精品亚洲一区二区小说| 日本精品少妇一区二区三区| 国产伦精品一区二区三区在线观看 | 久久精品国产亚洲夜色AV网站| 久久国产香蕉一区精品| 亚洲国产精品成人| 精品特级一级毛片免费观看| 日韩精品无码一区二区三区| 精品无码一区二区三区在线| 国产成人精品无码一区二区| 亚洲线精品一区二区三区影音先锋| 精品国产一区二区三区在线观看| 亚洲人成电影网站国产精品| 一本之道av不卡精品| 天天视频国产精品| 午夜精品久久影院蜜桃| 麻豆va在线精品免费播放| 日韩一区二区三区不卡视频| 日韩视频一区二区在线观看| 日韩无套内射视频6| 日韩一级在线播放| 一区二区国产精品| 国产精品igao视频| 精品福利一区二区三区精品国产第一国产综合精品 | 久久国产成人精品麻豆| 精品久久久久久久| 亚洲国产精品无码久久久不卡 | 日韩人妻激情制服丝袜另类| 国产成人亚洲精品蜜芽影院| 免费看国产精品麻豆| 国产九九久久99精品影院| 国产日韩高清三级精品人成| 日韩毛片人妻久久蜜桃传媒| 国产成人综合日韩精品婷婷九月| 香港aa三级久久三级老师2021国产三级精品三级在 | 国产自啪精品视频网站丝袜| 国内精品九九久久精品| 久久精品免费电影|