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不是一個變量么?)
2017-03-13
上面你對變量的引用理解沒有問題;說下對象引用這一塊,通常情況默認情況下對象是通過引用傳遞的,所以視頻里$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對象引用的官方文檔,希望能幫到你,
2019-04-16
謝謝!?
2017-03-13
根據你@Conqueror1st 的回答,我做了這個圖,不知道是否正確。
(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