亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

clone和=&的區別

我記得之前學習變量的時候有說到=和=&的區別。

$a = 10;

$b = $a; ? ? ? ?//賦值,內容相同,地址不同。

$c =& $a; ? ? //引用賦值,兩個變量都指向同一個數據,共享同一塊內存。

所以當$a變化的時候,$c會跟著變化,而$b保持原來的值不變。

*******************************************************************

那為什么到了對象這邊就不一樣了呢?

$obj1?=?$obj; 引用,兩個對象變量指向同一對象,當改變$Object1對象時,$Object2也做相同的變化。

????????????(如果這個成立,那之前說到析構函數的時候,為什么當$obj=null的時候,$obj1沒有跟著變化?如果都變化了,那應該觸發析構函數了;而老師當時說要 $obj1=&$obj,這樣$obj=null的時候才會直接觸發析構函數。)


$obj1?=?clone?$obj; 克隆,克隆的對象$Object1與原來的對象沒有任何關系,它是將原來的對象從當前位置從新復制了一份。

????????????(這個聽上去就和變量賦值$b = $a一模一樣誒。難道對象實例化之后賦值給$obj,這個$obj不是一個變量么?)



正在回答

3 回答

上面你對變量的引用理解沒有問題;說下對象引用這一塊,通常情況默認情況下對象是通過引用傳遞的,所以視頻里$james1 = $james相當于$james1 = &$james,$james->name改變也會導致$james1的name改變;$obj1=$obj;$obj=null的時,如果按正常思維就是引用傳遞的話,$obj1也應該是null,但結果顯然不是,就說明上面那句話不準確,下面這句話你要好好理解,

“在 PHP 5,一個對象變量已經不再保存整個對象的值。只是保存一個標識符來訪問真正的對象內容。 當對象作為參數傳遞,作為結果返回,或者賦值給另外一個變量,另外一個變量跟原來的不是引用的關系,只是他們都保存著同一個標識符的拷貝,這個標識符指向同一個對象的真正內容?!皡⒖糚HP官方文檔,注意那句話,另外一個變量跟原來的不是引用的關系。

這就能解釋為什么$obj1=$obj;$obj=null,按照文檔來說的話兩個對象變量并不是引用關系,簡單理解的話這時候$obj1=$obj可以理解為賦值,$obj=null,但是$obj1沒有跟著變化,因為$obj保存的只是一個標識符,改變了標識符的內容,但是真正的內容并沒有改變,所以$obj1沒有變化,也可以按上面變量那里理解成單純賦值,即是內容相同,地址不同。

http://www.php.net/manual/zh/language.oop5.references.php對象引用的官方文檔,希望能幫到你,

0 回復 有任何疑惑可以回復我~
#1

Conqueror1st

如果想讓$obj1和$obj相互獨立,互不影響的話就可以用clone即可。$obj = new Class();$obj1 = clone $obj,就相當于 $obj1 = new Class();
2017-03-13 回復 有任何疑惑可以回復我~
#2

Gemma_Tong 提問者

非常感謝!
2017-03-13 回復 有任何疑惑可以回復我~
#3

Gemma_Tong 提問者 回復 Conqueror1st

我大概明白了,你待會看下我回復的下層樓~我圖解看下 你看看對不對。
2017-03-13 回復 有任何疑惑可以回復我~
#4

Conqueror1st 回復 Gemma_Tong 提問者

好的~我也是剛自學不久,可能說的不是很清楚
2017-03-13 回復 有任何疑惑可以回復我~
#5

Gemma_Tong 提問者 回復 Conqueror1st

發了,你看下→_→
2017-03-13 回復 有任何疑惑可以回復我~
查看2條回復

謝謝!?

0 回復 有任何疑惑可以回復我~

根據你@Conqueror1st 的回答,我做了這個圖,不知道是否正確。

http://img1.sycdn.imooc.com//58c63f920001bad606900301.jpg

(1)$obj1 =& $obj

兩個對象變量引用賦值,保存的是同一個地址的標識符。

這種情況下,$obj1=null的話,也就是相當于ID1被清空,所以這時候對象A就沒有引用了,觸發了析構函數。


(2)$obj2=$obj

兩個對象變量賦值,值相同都是標識符,但是存儲在不同的地址,這個標識符都指向同一個地址——對象A。

這種情況下

1)$obj2=null,相當于ID2被清空,那么ID2指向對象A的引用沒有了,這時候對象A還有ID1在引用,所以沒有觸發析構函數。

2)修改$obj2的屬性,比如$obj->name = 'James',這時候修改的是指針指向的對象A的內容,所以一樣在引用對象A的$obj也會同步修改了name這個屬性。


(3)$obj3=clone $obj

對象復制,新增一個內存地址存儲對象B,B的所有屬性和方法和A一模一樣,只是地址不同。當然,標識符也是不同的地址和內容(內容不同是因為指向不同的地方)

這種情況下,修改$obj3的屬性對$obj毫無影響,因為大家都是殊途殊歸!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

未知是否這樣理解。如果有錯千萬指正啊o(╯□╰)o

2 回復 有任何疑惑可以回復我~
#1

Conqueror1st

我認為這樣理解是對的~感覺你的理解比我透徹??!
2017-03-13 回復 有任何疑惑可以回復我~
#2

Gemma_Tong 提問者 回復 Conqueror1st

圖解之后會容易理解一點。也是你提醒了我啊沒想到這個對象變量和普通變量會有這些差別→_→
2017-03-13 回復 有任何疑惑可以回復我~
#3

Conqueror1st 回復 Gemma_Tong 提問者

我也查了一些資料,還是官網那個說的最清楚,以后有問題還是要多去官網看
2017-03-13 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

clone和=&的區別

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號