久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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

 硬核項目經(jīng)理 2021-05-31

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

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

之前變量賦值的文章

PHP的變量賦值

對象引用測試

在繼續(xù)深入的學習PHP手冊后,,發(fā)現(xià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是實例化后的SimpleClass對象

  • $assigned直接賦值

  • $reference引用賦值

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

  • 然后將$instance賦值為null

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

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

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

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

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

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

而對象則與基本類型不同,它不能直接保存在數(shù)據(jù)槽中,,而是將對象的“句柄”保存在了數(shù)據(jù)槽,。這個句柄是指向?qū)ο筇囟▽嵗臉俗R符。雖然句柄不是我們所能直觀操作的類型,,但它也屬于基本類型,。

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

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

總結(jié)

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

這個內(nèi)容有點繞,,不過這樣的內(nèi)容才能更體現(xiàn)自己的核心能力。讀書百遍其義自現(xiàn),,對于手冊中的很多知識本人也是來回不斷學習才能理解,。上面的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./manual/zh/language.oop5.basic.php

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多