久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

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

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

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

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

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

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

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

      深拷貝:賦值時值完全復(fù)制,完全的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 //普通對象賦值,深拷貝,完全值復(fù)制 $m = 1; $n = $m; $n = 2; echo $m;//值復(fù)制,對新對象的改變不會對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)值復(fù)制,php提供了clone函數(shù)來實現(xiàn)復(fù)制對象。

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

      <?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)賦值 

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

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號