溫馨提示×

溫馨提示×

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

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

對(duì)象賦值在PHP中到底是不是引用

發(fā)布時(shí)間:2021-07-13 16:03:04 來源:億速云 閱讀:92 作者:chen 欄目:大數(shù)據(jù)

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

對(duì)象賦值在PHP中到底是不是引用?

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

之前變量賦值的文章

PHP的變量賦值

對(duì)象引用測試

在繼續(xù)深入的學(xué)習(xí)PHP手冊后,發(fā)現(xiàn)原來對(duì)象還真不是直接的引用復(fù)制。通過下面手冊中的例子來進(jìn)行分析:

 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是實(shí)例化后的SimpleClass對(duì)象

  • $assigned直接賦值

  • $reference引用賦值

  • 首先,我們給$instance對(duì)象定義了一個(gè)變量var

  • 然后將$instance賦值為null

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

  • 但是$assigned并沒有變成null,它依然是SimpleClass的實(shí)例對(duì)象,并且,劃重點(diǎn)哦:它有了var屬性

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

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

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

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

而對(duì)象則與基本類型不同,它不能直接保存在數(shù)據(jù)槽中,而是將對(duì)象的“句柄”保存在了數(shù)據(jù)槽。這個(gè)句柄是指向?qū)ο筇囟▽?shí)例的標(biāo)識(shí)符。雖然句柄不是我們所能直觀操作的類型,但它也屬于基本類型。

當(dāng)你獲取一個(gè)包含對(duì)象句柄的變量,并將其分配給另一個(gè)變量時(shí),另一個(gè)變量獲取的是這個(gè)對(duì)象的句柄。(注意,不是引用!不是引用!不是引用?。。Mㄟ^句柄,兩個(gè)變量都可以修改同一個(gè)對(duì)象。但是,這兩個(gè)變量并沒有直接關(guān)系,它們是兩個(gè)獨(dú)立的變量,其中一個(gè)變量修改為其他值時(shí),并不會(huì)對(duì)另一個(gè)變量產(chǎn)生影響。只有該變量在修改對(duì)象內(nèi)部的內(nèi)容時(shí),另一個(gè)變量因?yàn)槌钟邢嗤木浔运膶?duì)象內(nèi)容也會(huì)相應(yīng)地發(fā)生改變。

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

總結(jié)

通過本文的分析,我們可以看出,變量賦值說白了就是變量層面的操作。它保存的永遠(yuǎn)只是一個(gè)值而已。當(dāng)普通賦值時(shí),這個(gè)值就是一個(gè)基本類型。當(dāng)引用賦值時(shí),這個(gè)保存的基本類型就是一個(gè)指針。不管怎么樣,它也不會(huì)因?yàn)楸4娴氖菍?duì)象而將普通賦值直接轉(zhuǎn)變?yōu)橐觅x值,真正的引用賦值是必須要加&符的。

這個(gè)內(nèi)容有點(diǎn)繞,不過這樣的內(nèi)容才能更體現(xiàn)自己的核心能力。讀書百遍其義自現(xiàn),對(duì)于手冊中的很多知識(shí)本人也是來回不斷學(xué)習(xí)才能理解。上面的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

到此,關(guān)于“對(duì)象賦值在PHP中到底是不是引用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI