搜尋
首頁後端開發php教程php中關於淺複製和深複製的詳解

php中關於淺複製和深複製的詳解

Oct 28, 2017 am 09:56 AM
php複製詳解

PHP中的淺複製與深複製的實例詳解

#前言:

最近重溫了一下Design Pattern方面的知識,在看到Prototype Pattern這一設計模式時,注意到其中涉及到一個淺複製與深複製的問題。這裡來總結一下,提醒自己以後一定要多加註意。

自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);

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

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

以上是php中關於淺複製和深複製的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
您如何在PHP中創建和使用接口?您如何在PHP中創建和使用接口?Apr 30, 2025 pm 03:40 PM

本文解釋瞭如何創建,實施和使用PHP中的接口,重點關注其對代碼組織和可維護性的好處。

crypt()和password_hash()有什麼區別?crypt()和password_hash()有什麼區別?Apr 30, 2025 pm 03:39 PM

本文討論了PHP中的crypt()和password_hash()的差異,以進行密碼哈希,重點介紹其實施,安全性和對現代Web應用程序的適用性。

如何防止PHP中的跨站點腳本(XSS)?如何防止PHP中的跨站點腳本(XSS)?Apr 30, 2025 pm 03:38 PM

文章討論了通過輸入驗證,輸出編碼以及使用OWASP ESAPI和HTML淨化器之類的工具來防止PHP中的跨站點腳本(XSS)。

PHP中的自動加載是什麼?PHP中的自動加載是什麼?Apr 30, 2025 pm 03:37 PM

自動加載PHP會在需要時自動加載類文件,從而通過減少內存使用和增強代碼組織來提高性能。最佳實踐包括使用PSR-4和有效組織代碼。

什麼是PHP流?什麼是PHP流?Apr 30, 2025 pm 03:36 PM

PHP流通過一致的API來統一資源諸如文件,網絡插座和壓縮格式之類的處理,從而使復雜性抽象並增強代碼靈活性和效率。

可以使用PHP上傳的文件的最大大小是多少?可以使用PHP上傳的文件的最大大小是多少?Apr 30, 2025 pm 03:35 PM

本文討論了在PHP中管理文件上傳大小的管理,重點是2MB的默認限制以及如何通過修改PHP.INI設置來增加它。

PHP中的無效類型是什麼?PHP中的無效類型是什麼?Apr 30, 2025 pm 03:34 PM

本文討論了PHP 7.1中引入的PHP中的無效類型,允許變量或參數為指定類型或NULL。它突出顯示了諸如提高可讀性,類型安全性和明確意圖的好處,並解釋瞭如何聲明

unset()和unlink()函數之間有什麼區別?unset()和unlink()函數之間有什麼區別?Apr 30, 2025 pm 03:33 PM

本文討論了unset()和unlink()功能在編程中的差異,重點關注其目的和用例。 unset()從內存中刪除變量,而unlink()從文件系統中刪除文件。兩者都對效率至關重要

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具