在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

圖片描述

回答
編輯回答
臭榴蓮

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

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

先清楚一個(gè)概念:

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

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

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

看你第一種

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

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

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

看第二種:

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

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

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

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

$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');

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

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

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

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

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

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

2017年12月29日 12:58