PHP 中全域變數在函數中使用時必須申明為全域(Global這個關鍵字在函數中定義才有用)。
Global的作用是定義全域變數,但是這個全域變數不是應用於整個網站,而是應用於目前頁面,包括include或require的所有檔案。
<?PHP $a=123; function aa() { Global $a; //如果不把$a定义为global变量,函数体内是不能访问函数体外部的$a的,但是可以定义一个相同的名字$a, //此时这个变量是局部变量,等同于C语言的局部变量,只能在函数体内部使用。 echo $a; } aa(); ?>
在函數體內定義的global變數,函數體外可以使用,在函數體外定義的global變數不能在函數體內使用。
$global $a; $a=123; function f() { echo $a; //错误, } //再看看下面一例 function f() { global $a; $a=123; } f(); echo $a; //正确,可以使用
舉例比較:
<?php $var1 = 1; function test(){ unset($GLOBALS['var1']); } test(); echo $var1; ?>
因為$var1被刪除了,所以什麼東西都沒印。
<?php $var1 = 1; function test(){ global $var1; unset($var1); } test(); echo $var1; ?>
意外的印刷了1。證明刪除的只是別名引用,本身的值並沒有受到任何的改變。
global $var其實就是&$GLOBALS['var'],呼叫外部變數的一個別名而已。
上面程式碼中的$var1和$GLOBALS['var1']是指的相同變量,而不是兩個不同的變數。
PHP的全域變數和C語言有一點點不同。在C語言中,全域變數在函數中主動生效,除非被局部變數籠罩。這可能引起一些問題,有些人可能漫不經心的轉變一個全域變數。 PHP中全域變數在函數中應用時必須用global申明為全域。
PHP的Global變數的作用是定義全域變量,但是這個全域變數不是應用於整個網站,而是應用於目前頁面,包括include或require的所有檔案。
引用php手冊的$GLOBALS的解釋:
Global 變數:$GLOBALS,注意: $GLOBALS 在 PHP 3.0.0 及以後版本中適用。
由所有已定義全域變數組成的陣列。變數名就是該數組的索引。這是一個“superglobal”,或者可以描述為自動全域變數。
也就是說上面程式碼中的$var1和$GLOBALS['var1']是指的相同變量,而不是2個不同的變數!
如果在一個函數內部給一個宣告為 global 的變數賦於一個引用,該引用只在函數內部可見。可以透過使用 $GLOBALS 陣列來避免這一點。
我們都知道php中的函數所產生的變數都是函數的私有變量,那麼global關鍵字產生的變數也肯定逃不出這個規則,global在函數產生一個指向函數外部變數的別名變量,而不是真正的函數外部變量,一但改變了別名變量的指向地址,就會發生一些意料不到情況,$GLOBALS[]確確實實調用是外部的變量,函數內外會始終保持一致。
<?php $a = 1; $b = 2; function Sum() { global $a, $b; $b = $a + $b; } Sum(); echo $b; ?>
輸出將是 “3″。在函數中申明 了全域變數 $a 和 $b,任何變數的所有引用變數都會指向到全域變數。
怎麼不是2呢,在函數外部不是不影響嗎,請注意$b在函數中並沒有透過引用修改,而是修改的$b指向物理記憶體的值,因此外部輸入為3。
所以我們得出一個結論,在函數中global和$GLOBALS[]的區別在於:
global在函數產生一個指向函數外部變量的別名變量,而不是真正的函數外部變量,一但改變了別名變數的指向地址,就會發生一些意料不到情況。
$GLOBALS[]確實確實實調用是外部的變量,函數內外會始終保持一致!