這篇文章主要介紹php中global與$GLOBALS[' ']的差異 ,有興趣的朋友參考下,希望對大家有幫助。
一直以為在php中global和$GLOBALS[' ']沒有什麼差別,今天查了一下,發現兩者的有很大的差別.特作出以下總結:
global $var :是指向全域變數$var的一個引用;
$GLOBALS[“var”] : 是全域變數$var本身, 即等價於$var.
下面舉幾個例子:
例1:
<?php $var1 = 1; $var2 = 2; function test() { $GLOBALS['var2'] = &$GLOBALS['var1']; } test(); echo $var2;//输出1 ?>
test() 函數中$GLOBALS['var2'] 相當於全域變數$var1,
$GLOBALS['var2'] = $GLOBALS['var1'] 作用是將$var2變為$var1的引用,即$var2是$var1的別名,兩者指向同一個內存空間,所以\$var2的值變為1。
例2:
<?php $var1 = 1; $var2 = 2; function test(){ global $var1, $var2; $var2 = &$var1; echo $var2; $var2 = 'hello...'; } test(); // 输出 1 echo $var2; // 输出 2 echo $var1; // 输出 hello... ?>
在test函數中$var1和$var2分別是全域變數$var1和$var2的引用(即別名)
$var2 = &$var1; //test函數中的$var2(局部變數)的值更改為該函數內的$var1的引用
此時test函數中$var2的值等於該函數中$var1的值,也等於全域變數中$var1的值,三者指向同一塊記憶體空間,當test函數中的$var2的值改變時,另外兩個(test函數中的$var1和全域變數中的$var1)的值也隨之發生變化。
例3.
<?php $var1 = 1; function test(){ unset($GLOBALS['var1']); } test(); echo $var1; ?>
如同上面所說的,$GLOBALS['var1'] 與全域變數中的$var1是等價的,unset($GLOBALS['var1' ] );等價於將全域變數$var1銷毀,所以印出空
補充:
php中unset()函數是用來銷毀變數的,在很多時候,它只是將變數銷毀,但記憶體裡面的值並沒有銷毀(即unset()函數指數切斷變數與記憶體之間的關係,將變數名稱銷毀,記憶體裡面的值並沒有銷毀,記憶體也沒有釋放),需要注意的是:
1.函數只在變數所佔的記憶體超過256個位元組的時候,才會將記憶體釋放。
2. 只有在所有指向該變數所指向的記憶體的變數(如該變數的所有引用)都被銷毀,位址才會被釋放。
例4.
<?php $var1 = 1; function test(){ global $var1; unset($var1); } test(); echo $var1; //结果为打印1 ?>
在這段程式碼裡,test()函數中使用global定義的變數其實只是一個指向全域變數$var的引用,在test()函數中銷毀該變數相當於銷毀了全域變數的一個引用(一塊內存,有兩個名字,刪除其中的一個名字,對另一個名字和該記憶體的值並不有影響),所以,當在列印全域變量$var時,結果仍為1。段落程式碼與下面的程式碼所進行的操作是類似的:
<?php $var = 1; $var1 = &$var; unset($var1); echo $var; ?>
再看一個在函數內部引用全域變數的例子:
<?php $var1 = "我是变量var1的值"; $var2 = "我是变量var2的值"; function global_references($use_globals) { global $var1, $var2; if (!$use_globals) { $var2 = &$var1; echo $var1; echo $var2; echo "<br />"; } else { $GLOBALS["var2"] = &$var1; echo $var1; echo $var2; echo "<br />"; } } global_references(false); //1.打印:我是变量var1的值我是变量var1的值 echo $var1; echo $var2; echo "<br />"; //2.打印:我是变量var1的值我是变量var2的值 global_references(true); //3.打印:我是变量var1的值我是变量var2的值 echo $var1; echo $var2; echo "<br />"; //4.打印:我是变量var1的值我是变量var1的值 ?>
因為參數為false,所以執行if裡面的語句,將global_references()函數內宣告的原本為全域變數var2引用的var2的值變成var1的引用,所以global_references()函數內印出的兩個變數都是全域變數var1的引用。
1執行的語句並沒有對全域變數的值產生影響,所以列印的還是程式開始宣告的值。
因為參數為true,所以執行else裡面的語句,將全域變數var1的值變成全域變數var1的引用(global_references()函數內宣告的var1)的引用,這並沒有改變global_references()中宣告的var2的值(仍為原來記憶體的引用)。
經過3之後,全域變數var2已經成為全域變數var1的引用了,所以此時兩個全域變數的值都相同。
總結:
global $var : 是指向全域變數$var的一個引用;
$GLOBALS[“var”] : 是全域變數$var本身, 即等價於$var.
前者若是在函數內部宣告的變量,其作用域為該函數,即只在該函數內可見,這個變數是指向全域變數的引用,銷毀該變數並不會對其所指向的全域變數有影響。
相關建議:
PHP json_encode($GLOBALS)出錯的原因
以上是php中global與$GLOBALS[的詳細內容。更多資訊請關注PHP中文網其他相關文章!