溫馨提示×

溫馨提示×

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

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

對象賦值在PHP中到底是不是引用

發布時間:2021-07-13 16:03:04 來源:億速云 閱讀:130 作者:chen 欄目:大數據

這篇文章主要介紹“對象賦值在PHP中到底是不是引用”,在日常操作中,相信很多人在對象賦值在PHP中到底是不是引用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”對象賦值在PHP中到底是不是引用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

對象賦值在PHP中到底是不是引用?

之前的文章中,我們說過變量賦值的問題,其中有一個問題是對象在進行變量賦值的時候,直接就是引用賦值。那么到底真實情況是怎樣呢?

之前變量賦值的文章

PHP的變量賦值

對象引用測試

在繼續深入的學習PHP手冊后,發現原來對象還真不是直接的引用復制。通過下面手冊中的例子來進行分析:

 1class SimpleClass
2{}
3
4$instance = new SimpleClass();
5
6$assigned = $instance;
7$reference = &$instance;
8
9$instance->var = '$assigned will have this value';
10
11$instance = null; // $instance and $reference become null
12
13var_dump($instance);
14var_dump($reference);
15var_dump($assigned);
  • $instance是實例化后的SimpleClass對象

  • $assigned直接賦值

  • $reference引用賦值

  • 首先,我們給$instance對象定義了一個變量var

  • 然后將$instance賦值為null

  • 對于引用來說,$reference變量自然也為成了null

  • 但是$assigned并沒有變成null,它依然是SimpleClass的實例對象,并且,劃重點哦:它有了var屬性

是不是很神奇,照理說,普通賦值是拷貝,兩個變量不會相互影響。而引用賦值是復制指針(相同的內存地址),修改任意一個變量其他的變量也會改變。但是對象的普通賦值貌似并不屬于它們中的任何一個。

$reference很好理解,本身使用&符號進行了賦值,表明了這個變量是一個引用賦值。它成為了$instance的快捷方式,$instance的一切變化它都都會跟著改變。這是變量層面的。

$assigned從代碼字面上看是一個普通賦值。不過對象是一種特殊的形態,它用普通賦值賦過來的值其實是對象的一個句柄。在PHP手冊中有一個Note是如此描述的:

首先,將PHP中的變量看成是一個一個的數據槽。這個數據槽可以保存一個基本類型(int、string、bool等)。創建引用時,這個槽里保存的是內存地址,或者說是指向引用對象的一個指針,引用沒有拷貝操作,僅僅是將指針指向了原變量(參考數據結構)。創建普通賦值時,則是拷貝的基本類型。

而對象則與基本類型不同,它不能直接保存在數據槽中,而是將對象的“句柄”保存在了數據槽。這個句柄是指向對象特定實例的標識符。雖然句柄不是我們所能直觀操作的類型,但它也屬于基本類型。

當你獲取一個包含對象句柄的變量,并將其分配給另一個變量時,另一個變量獲取的是這個對象的句柄。(注意,不是引用!不是引用!不是引用?。。?。通過句柄,兩個變量都可以修改同一個對象。但是,這兩個變量并沒有直接關系,它們是兩個獨立的變量,其中一個變量修改為其他值時,并不會對另一個變量產生影響。只有該變量在修改對象內部的內容時,另一個變量因為持有相同的句柄,所以它的對象內容也會相應地發生改變。

Note原文:
https://www.php.net/manual/zh/language.oop5.basic.php#79856

總結

通過本文的分析,我們可以看出,變量賦值說白了就是變量層面的操作。它保存的永遠只是一個值而已。當普通賦值時,這個值就是一個基本類型。當引用賦值時,這個保存的基本類型就是一個指針。不管怎么樣,它也不會因為保存的是對象而將普通賦值直接轉變為引用賦值,真正的引用賦值是必須要加&符的。

這個內容有點繞,不過這樣的內容才能更體現自己的核心能力。讀書百遍其義自現,對于手冊中的很多知識本人也是來回不斷學習才能理解。上面的Note作者寫得非常好,英文好的朋友可以直接去看英文原版。

測試代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/201911/source/%E5%AF%B9%E8%B1%A1%E8%B5%8B%E5%80%BC%E5%9C%A8PHP%E4%B8%AD%E5%88%B0%E5%BA%95%E6%98%AF%E4%B8%8D%E6%98%AF%E5%BC%95%E7%94%A8%EF%BC%9F.php

參考文檔:
https://www.php.net/manual/zh/language.oop5.basic.php

到此,關于“對象賦值在PHP中到底是不是引用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

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

php
AI

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