溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中淺復制與深復制的區別是什么

發布時間:2021-01-13 16:29:23 來源:億速云 閱讀:197 作者:Leah 欄目:開發技術

PHP中淺復制與深復制的區別是什么?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

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

這里舉個栗子:

class Example1
{
  public $name;

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

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

$ex2->name = 'test2';// 這樣修改一下之后,$ex1->name與$ex2->name都變為了:test2

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

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

$ex2->name = 'test2';//現在$ex1->name還是test1,而$ex2->name是test2

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

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

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

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

方式一:利用__clone方法

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

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

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

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

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女