中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

php中深拷貝和淺拷貝有哪些區(qū)別

本篇內(nèi)容介紹了“php中深拷貝和淺拷貝有哪些區(qū)別”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

肅北網(wǎng)站建設公司成都創(chuàng)新互聯(lián)公司,肅北網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為肅北超過千家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務好的肅北做網(wǎng)站的公司定做!

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

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

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

先說一下深拷貝和淺拷貝通俗理解

深拷貝:賦值時值完全復制,完全的copy,對其中一個作出改變,不會影響另一個

淺拷貝:賦值時,引用賦值,相當于取了一個別名。對其中一個修改,會影響另一個

PHP中, = 賦值時,普通對象是深拷貝,但對對象來說,是淺拷貝。也就是說,對象的賦值是引用賦值。(對象作為參數(shù)傳遞時,也是引用傳遞,無論函數(shù)定義時參數(shù)前面是否有&符號)

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

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

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

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

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

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

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

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

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

寫clone函數(shù):如下

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

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

第二種方法,利用序列化反序列化實現(xiàn),這種方法實現(xiàn)對象的深拷貝簡單,不需要修改類

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

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

“php中深拷貝和淺拷貝有哪些區(qū)別”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

本文名稱:php中深拷貝和淺拷貝有哪些區(qū)別
網(wǎng)站路徑:http://www.rwnh.cn/article34/gcgjpe.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站做網(wǎng)站、云服務器、網(wǎng)站營銷、虛擬主機、全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
华安县| 原阳县| 武陟县| 衡阳县| 凭祥市| 湾仔区| 来宾市| 两当县| 尚志市| 来安县| 岚皋县| 阜南县| 土默特右旗| 孟村| 前郭尔| 唐河县| 枝江市| 黑龙江省| 芜湖县| 桓台县| 登封市| 沈阳市| 璧山县| 舒兰市| 菏泽市| 分宜县| 扎兰屯市| 太湖县| 鹤山市| 右玉县| 长春市| 旅游| 河北区| 齐河县| 九寨沟县| 凭祥市| 大安市| 哈密市| 阳原县| 济南市| 江孜县|