原來以為global和$GLOBALS除了寫法不一樣以為,其他都一樣,可是在實(shí)際應(yīng)用中發(fā)現(xiàn),2者的區(qū)別還是很大的!
先看下面的例子:
- <?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";
- ?>
復(fù)制代碼
執(zhí)行結(jié)果為:
怎么會(huì)這樣呢?不應(yīng)該是2個(gè)5嗎?怎么會(huì)出現(xiàn)1個(gè)0和1個(gè)5呢?
恩,我們保留以上問題,深入分析$GLOBALS和global的原理!
引用php手冊(cè)的$GLOBALS的解釋:
Global 變量:$GLOBALS
注意: $GLOBALS 在 PHP 3.0.0 及以后版本中適用。
由所有已定義全局變量組成的數(shù)組。變量名就是該數(shù)組的索引。
這是一個(gè)“superglobal”,或者可以描述為自動(dòng)全局變量。
也就是說上面代碼中的
$var1和
$GLOBALS['var1']是指的同一變量,而不是2個(gè)不同的變量!
下面來分析global到底做了什么?
我們都知道php中的函數(shù)所產(chǎn)生的變量都是函數(shù)的私有變量,那么global關(guān)鍵字產(chǎn)生的變量也肯定逃不出這個(gè)規(guī)則,為什么這么說呢,看下面的代碼:
- <?php
- // 例子2
- function test() {
- global $a;
- unset($a);
- }
- $a = 1;
- test();
- print $a;
- ?>
復(fù)制代碼
執(zhí)行結(jié)果為:
為什么會(huì)輸出1呢?不是已經(jīng)把$a給unset了嗎?unset失靈了?php的bug?
都不是,其實(shí)unset起作用了,是把test函數(shù)中的$a給unset掉了,可以在函數(shù)后面加入
所以我們得出一個(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ì)始終保持一致!