前兩天看到一道關(guān)于global與$GLOBALS的面試題减江,覺(jué)得挺有趣,廢話(huà)不多說(shuō)捻爷,直接上代碼(在簡(jiǎn)書(shū)編輯器上手打代碼太凌亂了辈灼,所以就貼圖啦~\(≧▽≦)/~):
? ? ? 相信大家看完代碼,都一定會(huì)有自己的答案也榄,我在看完代碼之后巡莹,斬釘截鐵、毫不猶豫甜紫、毅然決然地表示降宅,輸出結(jié)果是5和5,骨感的現(xiàn)實(shí)告訴我囚霸,我還是 too young too simple钉鸯,正確的答案其實(shí)是0和5,這道題其實(shí)就是考察global與$GLOBALS之間的區(qū)別邮辽,下面進(jìn)行一下分析:
? ? ? 我們首先來(lái)看一個(gè)例子(抱歉唠雕,又貼圖啦)
執(zhí)行結(jié)果為:a,我就納悶了吨述,不是unset了嗎岩睁,怎么還輸出a呀,難道unset失效揣云?我們?cè)赿emo函數(shù)中捕儒,echo $a看一下,unset是否生效。
執(zhí)行結(jié)果為:Notice: Undefined variable: a in G:\wamp\www\test.php on line8刘莹,unset是生效的阎毅,這說(shuō)明,demo中的$a與函數(shù)外的$a点弯,其實(shí)是不一樣的扇调。經(jīng)過(guò)查詢(xún)PHP文檔得知,函數(shù)內(nèi)global的變量與函數(shù)外的全局變量抢肛,其實(shí)是不一樣的變量狼钮,既然是不一樣的變量,我們?yōu)榱嗣枋龇奖慵裥酰謩e給它們?nèi)〔煌拿郑?b>demo->$a(函數(shù)內(nèi)global的變量)熬芜,$a(全局變量),demo->$a和$a指向的是同一個(gè)物理內(nèi)存地址福稳,當(dāng)unset demo->$a時(shí)涎拉,對(duì)$a是沒(méi)有影響的,$a還是指向那個(gè)內(nèi)存地址的圆,內(nèi)存地址存放的值曼库,還是之前的字符串a(chǎn)。當(dāng)我們把demo函數(shù)中的 global $a替換成$GLOBALS['a']時(shí)略板,如下
執(zhí)行結(jié)果為:Notice: Undefined variable: a in G:\wamp\www\test.php on line10,說(shuō)明$GLOBALS['a']與函數(shù)外的$a就是同一個(gè)變量毁枯,不是雙胞胎,不是親兄弟叮称,他就是同一個(gè)人呀V致辍!瓤檐!~~~赂韵,所以在函數(shù)中unset,函數(shù)外就直接報(bào)錯(cuò)了挠蛉〖朗荆總結(jié)一下:函數(shù)內(nèi)global和全局變量其實(shí)還是兩個(gè)不一樣的變量,只是兩個(gè)變量之間是引用關(guān)系(推了推黑框眼鏡)谴古,而$GLOBALS['a']和全局變量$a质涛,就是同一個(gè)變量。有了這個(gè)結(jié)論掰担,我們?cè)賮?lái)看上面的面試題汇陆,就豁然開(kāi)朗啦(為了大家不用再倒回去看代碼,此處再貼一次代碼)
test_global函數(shù)中带饱,用的是global毡代,所以test_global->$var1, $var2(global $var1, $var2)和函數(shù)外的$var1, $var2其實(shí)是不同的變量阅羹,只是存在引用關(guān)系。test_global函數(shù)中教寂,改變的只是test_global->$var1, $var2(global $var1, $var2)的指向關(guān)系捏鱼,并不影響函數(shù)外的$var1, $var2的指向,所以第一個(gè)輸出是0酪耕。test_globals函數(shù)导梆,用的是$GLOBALS['var3'],上文已經(jīng)說(shuō)過(guò)因妇,$GLOBALS['var3']和$var3就是同一個(gè)變量问潭,那改變了$GLOBALS['var3']的指向猿诸,就是改變$var3的指向了嘛婚被,所以,第二個(gè)輸出就是5梳虽。