官方文檔:數組
global指對變量的引用或者叫指針,$GLOBALS則是變量自己;ide
$var1 = 1; $var2 = 2; function fun(){ $GLOBALS['var2'] = &$GLOBALS['var1']; echo $GLOBALS['var2']; $GLOBALS['var2'] = 3; } fun(); echo $var2; echo $var1; echo "\r\n"; function fun1(){ global $var1, $var2; $var2 = &$var1; echo $var2; echo "\r\n"; $var2 = 3; } fun1(); echo $var2; echo $var1;
以上代碼中函數外部變量能夠視爲var1指向一個box,box中就是變量值,此處是1,var2指向另一個box,也是變量值,此處是2;函數
對於$GLOBALS數組中的var1及var2實際就是這兩個變量自己,也就是否是另外兩塊分別指向兩個box的變量空間;spa
因此在函數內部改變var2的值,也就是第二個box的值被複製成了第一個box的值,第一次echo就是複製的第一個box的值,而後在函數內部從新賦值爲3,外部的var2天然也就改變,由於它們同爲一個變量;3d
接着若是函數內部var2被賦值爲&var1,也就是將var2指向了第二個box,此時var1,var2都指向了box1,天然var2改變了值,也就是第一個box中的值被改變了。指針
而對於global則至關於內部從新分配了兩個同名變量空間,可是呢,var1指向外部那個var1的box,var2指向外部那個var2的box,此時box成了4個,給var2賦值爲var1,實際就是將兩個var1指向的那個box的值複製給兩個var2指向的box,此時天然在var2被從新賦值後,外部的var2值也變了,可是var1的值並無被改變;但若改成給var1賦值&var2,也就意味着內部的var2已經指向了內外部var1指向的第一個box,惟獨外部的var2仍是指向第二個box,此時改變內部var2的值,只會影響內外部var1和內部已經改變指向的var2那個box,即第一個box的值,可是第二個box的值,也就是外部var2指向的box值並未改變。code
如此,便明瞭了。blog