對象賦值在PHP中到底是不是引用,?之前的文章中,,我們說過變量賦值的問題,,其中有一個問題是對象在進行變量賦值的時候,,直接就是引用賦值。那么到底真實情況是怎樣呢,?
在繼續(xù)深入的學習PHP手冊后,,發(fā)現(xiàn)原來對象還真不是直接的引用復制。通過下面手冊中的例子來進行分析: 1class SimpleClass
是不是很神奇,照理說,,普通賦值是拷貝,,兩個變量不會相互影響。而引用賦值是復制指針(相同的內(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原文:
通過本文的分析,,我們可以看出,,變量賦值說白了就是變量層面的操作。它保存的永遠只是一個值而已,。當普通賦值時,,這個值就是一個基本類型,。當引用賦值時,這個保存的基本類型就是一個指針,。不管怎么樣,,它也不會因為保存的是對象而將普通賦值直接轉(zhuǎn)變?yōu)橐觅x值,真正的引用賦值是必須要加&符的,。 這個內(nèi)容有點繞,,不過這樣的內(nèi)容才能更體現(xiàn)自己的核心能力。讀書百遍其義自現(xiàn),,對于手冊中的很多知識本人也是來回不斷學習才能理解,。上面的Note作者寫得非常好,英文好的朋友可以直接去看英文原版,。 測試代碼: 參考文檔: |
|
來自: 硬核項目經(jīng)理 > 《待分類》