clone和=&的區(qū)別
我記得之前學(xué)習(xí)變量的時(shí)候有說到=和=&的區(qū)別。
$a = 10;
$b = $a; ? ? ? ?//賦值,內(nèi)容相同,地址不同。
$c =& $a; ? ? //引用賦值,兩個(gè)變量都指向同一個(gè)數(shù)據(jù),共享同一塊內(nèi)存。
所以當(dāng)$a變化的時(shí)候,$c會(huì)跟著變化,而$b保持原來的值不變。
*******************************************************************
那為什么到了對(duì)象這邊就不一樣了呢?
$obj1?=?$obj; 引用,兩個(gè)對(duì)象變量指向同一對(duì)象,當(dāng)改變$Object1對(duì)象時(shí),$Object2也做相同的變化。
????????????(如果這個(gè)成立,那之前說到析構(gòu)函數(shù)的時(shí)候,為什么當(dāng)$obj=null的時(shí)候,$obj1沒有跟著變化?如果都變化了,那應(yīng)該觸發(fā)析構(gòu)函數(shù)了;而老師當(dāng)時(shí)說要 $obj1=&$obj,這樣$obj=null的時(shí)候才會(huì)直接觸發(fā)析構(gòu)函數(shù)。)
$obj1?=?clone?$obj; 克隆,克隆的對(duì)象$Object1與原來的對(duì)象沒有任何關(guān)系,它是將原來的對(duì)象從當(dāng)前位置從新復(fù)制了一份。
????????????(這個(gè)聽上去就和變量賦值$b = $a一模一樣誒。難道對(duì)象實(shí)例化之后賦值給$obj,這個(gè)$obj不是一個(gè)變量么?)
2017-03-13
上面你對(duì)變量的引用理解沒有問題;說下對(duì)象引用這一塊,通常情況默認(rèn)情況下對(duì)象是通過引用傳遞的,所以視頻里$james1 = $james相當(dāng)于$james1 = &$james,$james->name改變也會(huì)導(dǎo)致$james1的name改變;$obj1=$obj;$obj=null的時(shí),如果按正常思維就是引用傳遞的話,$obj1也應(yīng)該是null,但結(jié)果顯然不是,就說明上面那句話不準(zhǔn)確,下面這句話你要好好理解,
“在 PHP 5,一個(gè)對(duì)象變量已經(jīng)不再保存整個(gè)對(duì)象的值。只是保存一個(gè)標(biāo)識(shí)符來訪問真正的對(duì)象內(nèi)容。 當(dāng)對(duì)象作為參數(shù)傳遞,作為結(jié)果返回,或者賦值給另外一個(gè)變量,另外一個(gè)變量跟原來的不是引用的關(guān)系,只是他們都保存著同一個(gè)標(biāo)識(shí)符的拷貝,這個(gè)標(biāo)識(shí)符指向同一個(gè)對(duì)象的真正內(nèi)容?!皡⒖糚HP官方文檔,注意那句話,另外一個(gè)變量跟原來的不是引用的關(guān)系。
這就能解釋為什么$obj1=$obj;$obj=null,按照文檔來說的話兩個(gè)對(duì)象變量并不是引用關(guān)系,簡(jiǎn)單理解的話這時(shí)候$obj1=$obj可以理解為賦值,$obj=null,但是$obj1沒有跟著變化,因?yàn)?obj保存的只是一個(gè)標(biāo)識(shí)符,改變了標(biāo)識(shí)符的內(nèi)容,但是真正的內(nèi)容并沒有改變,所以$obj1沒有變化,也可以按上面變量那里理解成單純賦值,即是內(nèi)容相同,地址不同。
http://www.php.net/manual/zh/language.oop5.references.php對(duì)象引用的官方文檔,希望能幫到你,
2019-04-16
謝謝!?
2017-03-13
根據(jù)你@Conqueror1st 的回答,我做了這個(gè)圖,不知道是否正確。
(1)$obj1 =& $obj
兩個(gè)對(duì)象變量引用賦值,保存的是同一個(gè)地址的標(biāo)識(shí)符。
這種情況下,$obj1=null的話,也就是相當(dāng)于ID1被清空,所以這時(shí)候?qū)ο驛就沒有引用了,觸發(fā)了析構(gòu)函數(shù)。
(2)$obj2=$obj
兩個(gè)對(duì)象變量賦值,值相同都是標(biāo)識(shí)符,但是存儲(chǔ)在不同的地址,這個(gè)標(biāo)識(shí)符都指向同一個(gè)地址——對(duì)象A。
這種情況下
1)$obj2=null,相當(dāng)于ID2被清空,那么ID2指向?qū)ο驛的引用沒有了,這時(shí)候?qū)ο驛還有ID1在引用,所以沒有觸發(fā)析構(gòu)函數(shù)。
2)修改$obj2的屬性,比如$obj->name = 'James',這時(shí)候修改的是指針指向的對(duì)象A的內(nèi)容,所以一樣在引用對(duì)象A的$obj也會(huì)同步修改了name這個(gè)屬性。
(3)$obj3=clone $obj
對(duì)象復(fù)制,新增一個(gè)內(nèi)存地址存儲(chǔ)對(duì)象B,B的所有屬性和方法和A一模一樣,只是地址不同。當(dāng)然,標(biāo)識(shí)符也是不同的地址和內(nèi)容(內(nèi)容不同是因?yàn)橹赶虿煌牡胤剑?/p>
這種情況下,修改$obj3的屬性對(duì)$obj毫無影響,因?yàn)榇蠹叶际鞘馔臼鈿w!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
未知是否這樣理解。如果有錯(cuò)千萬指正啊o(╯□╰)o