鍍金池/ 問答/PHP/ 這兩種方式賦值的結(jié)果為什么不一樣呢?

這兩種方式賦值的結(jié)果為什么不一樣呢?

圖片描述

回答
編輯回答
臭榴蓮

上面都很平常
下面這段,&$a,意思是讓a都使用同一個地址
$a = null;給這個地址賦值為null,所以打印的就是null
應(yīng)該是這樣,恩沒錯就是這樣~~~~

2017年7月11日 17:36
編輯回答
不將就

先清楚一個概念:

普通賦值,改變一個,其余變量值不變;
引用變量賦值,改變一個,其余變量值跟著變;

再來細說:
其實這種情況都和引用計數(shù)有關(guān)。

我們知道在php中存儲變量的是一個叫做zval的容器,這個容器中除了存放數(shù)據(jù)值和類型之外,還存放了兩個信息,一個是is_ref,表示這個變量是否是引用變量,另外一個是refcount,表示的是變量的個數(shù);接下來看代碼:

看你第一種

$a = new Per();
$b = $a;
$a = null;

第二行,把已經(jīng)賦值過的變量a再賦值給b的時候,這個時候是普通變量之間的互相賦值。所以is_ref這個標識不會改變,而refcount則會自增+1;因為$a 和 $b 的值和數(shù)據(jù)類型都是相同的,所以用同一個zval容器也沒問題;

但是下面的時候,把其中一個的值修改了,那么原先$a上的refcount就會自減一;而$b就會使用一個新的內(nèi)存地址,生成一個新的zval容器。

看第二種:

$a = new Per();
$b = &$a;
$a = null;

這種情況下,看第二行,當(dāng)有引用動作的時候,$a變量里的is_ref標識則會從0變?yōu)?,表示這個變量是引用變量;而refcount則會自增+1,表示容器的變量個數(shù);

由于使用的是同一內(nèi)存地址,同一zval容器,又是引用關(guān)系。所以改一個值,其余的引用的值,都會跟著改變了。

可以用下面代碼測試,is_refrefcount在普通變量賦值和引用賦值時候的一些改變情況:

$a = 10;
xdebug_debug_zval('a');
$b = &$a;
xdebug_debug_zval('a');
$a = 20;
xdebug_debug_zval('a');



$a = 10;
xdebug_debug_zval('a');
$b = $a;
xdebug_debug_zval('a');
$a = 20;
xdebug_debug_zval('b');

相信你會有所發(fā)現(xiàn),以上。

2018年8月15日 09:17
編輯回答
刮刮樂

第一個是按值傳遞,傳遞的是對象的內(nèi)存地址,$a和$b的值都指向了對象的內(nèi)存地址

第二個是引用傳遞,傳遞的是變量的地址。通過學(xué)習(xí)c/c++語言,我們知道,變量本身需要有一個空間存放自己的地址,而$b的值指向了$a的內(nèi)存地址,所以第二個unset($a)會把變量分配的內(nèi)存給銷毀,而$b是通過$a的地址去找對象的內(nèi)存地址的,沒了$a,$b自然是指向了無效的內(nèi)存地址。

2018年3月15日 09:59
編輯回答
笨小蛋

這就是普通賦值和引用賦值的區(qū)別,普通賦值只是把$a的值傳遞給了$b,而下面的引用賦值不僅把$b指向了和$a相同的地址空間,這個時候$b就是$a,即使現(xiàn)在unset($b),輸出的時候還是會輸出并且他的值是$a.

2017年12月29日 12:58