PHP代碼 復(fù)制代碼 代碼如下: <?php // 例子1 function test_global() { global $var1, $var2; $var2 =& $var1; } function test_globals() { $GLOBALS['var3'] =& $GLOBALS['var1']; } $var1 " /> 最新国产午夜精品视频不卡,免费激情网址,国产日韩第一页

一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

PHP語言中g(shù)lobal和$GLOBALS[]的分析 之二

還是借用上一篇的例子:

php代碼
復(fù)制代碼 代碼如下:
<?php
// 例子1
function test_global() {
global $var1, $var2;
$var2 =& $var1;
}
function test_globals() {
$GLOBALS['var3'] =& $GLOBALS['var1'];
}
$var1 = 5;
$var2 = $var3 = 0;
test_global();
print $var2 .”/n”;
test_globals();
print $var3 .”/n”;
?>

執(zhí)行結(jié)果為:
0
5
怎么會(huì)這樣呢?不應(yīng)該是2個(gè)5嗎?怎么會(huì)出現(xiàn)1個(gè)0和1個(gè)5呢?

恩,我們保留以上問題,深入分析$GLOBALS和global的原理!
我們都知道變量其實(shí)是相應(yīng)物理內(nèi)存在代碼中的”代號(hào)”而已
引用php手冊(cè)的$GLOBALS的解釋:
Global 變量:$GLOBALS,注意: $GLOBALS 在 php 3.0.0 及以后版本中適用。
由所有已定義全局變量組成的數(shù)組。變量名就是該數(shù)組的索引。這是一個(gè)“superglobal”,或者可以描述為自動(dòng)全局變量。
也就是說上面代碼中的$var1和$GLOBALS['var1']是指的同一變量,而不是2個(gè)不同的變量!
下面來分析global到底做了什么?
引用php手冊(cè)的global的解釋:
如果在一個(gè)函數(shù)內(nèi)部給一個(gè)聲明為 global 的變量賦于一個(gè)引用,該引用只在函數(shù)內(nèi)部可見。可以通過使用 $GLOBALS 數(shù)組避免這一點(diǎn)。
我們都知道php中的函數(shù)所產(chǎn)生的變量都是函數(shù)的私有變量,那么global關(guān)鍵字產(chǎn)生的變量也肯定逃不出這個(gè)規(guī)則,為什么這么說呢,看下面的代碼:
php代碼
復(fù)制代碼 代碼如下:
<?php
// 例子2
function test() {
global $a;
unset($a);
}
$a = 1;
test();
print $a;
?>

執(zhí)行結(jié)果為:
1
為什么會(huì)輸出1呢?不是已經(jīng)把$a給unset了嗎?unset失靈了?php的bug?
都不是,其實(shí)unset起作用了,是把test函數(shù)中的$a給unset掉了,可以在函數(shù)test()中加入
print $a;
來測(cè)試!
接著回到上面的例子1,看test_global中的這一代碼“$var2 =& $var1;”,上面是一個(gè)引用賦值運(yùn)算,也就是$var2將指向var1所指向的物理內(nèi)存地址,所以例子1執(zhí)行過test_global函數(shù)以后,變量的變化只在函數(shù)的局部產(chǎn)生效應(yīng),在函數(shù)外部$var2的指向物理內(nèi)存地址并沒有變化,還是它自己.
此時(shí),就能理解為什么例子1執(zhí)行完以后,$var2是0,而$var3是5了!
所以我們得出一個(gè)結(jié)論,在函數(shù)中g(shù)lobal和$GLOBALS[]的區(qū)別在于:
global在函數(shù)產(chǎn)生一個(gè)指向函數(shù)外部變量的別名變量,而不是真正的函數(shù)外部變量,一但改變了別名變量的指向地址,就會(huì)發(fā)生一些意料不到情況,例如例子 1.
$GLOBALS[]確確實(shí)實(shí)調(diào)用是外部的變量,函數(shù)內(nèi)外會(huì)始終保持一致
可以對(duì)照 下面兩個(gè)列子再加深下印象:
global:
復(fù)制代碼 代碼如下:
<?php
function myfunction(){
global $bar;
unset($bar);
}
$bar=”someting”;
myfunction();
echo $bar;
?>

輸出:someting
$GLOBALS[]:
復(fù)制代碼 代碼如下:
<?php
function foo()
{
unset($GLOBALS['bar']);
}
$bar = “something”;
foo();
echo $bar;
?>

輸出:空
當(dāng)按照上面的思路理解后,碰到下面的情況是不是又有些暈?zāi)?
復(fù)制代碼 代碼如下:
<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
?>

輸出將是 “3″。在函數(shù)中申明 了全局變量 $a 和 $b,任何變量的所有引用變量都會(huì)指向到全局變量。
怎么不是2呢,在函數(shù)外部不是不影響嗎,請(qǐng)注意$b在函數(shù)中并沒有通過引用修改,而是修改的$b指向物理內(nèi)存的值,因此外部輸入為3。

php技術(shù)PHP語言中g(shù)lobal和$GLOBALS[]的分析 之二,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 六月激情婷婷 | 国产手机在线精品 | 亚洲综合久久综合激情久久 | 国内精品小视频在线 | 91原创视频 | 伊人婷婷 | 免费看污视频在线观看 | 久久精品亚洲牛牛影视 | 中文字幕在线视频第一页 | 在线视频一区二区三区在线播放 | 激情小视频 | 91精品一区二区综合在线 | 午夜激情视频免费 | 色老板在线观看视频 | 好吊妞视频haodiaoniucom | 91亚洲免费 | 久久久久久亚洲精品中文字幕 | 丁香八月婷婷 | 国内精自线一二三四2021小说 | 视频在线观看一区二区三区 | 伊人久久中文大香线蕉综合 | 色婷婷影视| 精品久久久久久中文 | 国产欧美一区二区精品性色tv | 婷婷色爱区综合五月激情韩国 | 国产精品成人观看视频国产 | 久久久久久麻豆 | 久久久久avav久久久 | 狠狠色噜噜狠狠狠狠奇米777 | 国产91在线精品福利 | 欧美精品第二页 | 亚洲视频一区在线观看 | 六月婷婷久久 | 免费看黄色的视频 | 婷婷深爱网 | 黄网址在线 | 草草草在线观看 | 人人狠狠综合久久亚洲婷婷 | 亚洲国产激情在线一区 | 国产综合成人观看在线 | 国产小视频国产精品 |