聊一聊PHP的global
眾所周知,在PHP的函式中,如果想使用全域性變數,一種是使用 超全域性變數 $GLOBALS
,另一種是在函式中使用 global
關鍵字宣告,使用超全域性變數$GLOBALS的方式大家都知道了,今天來好好聊一聊使用global方式來宣告變數。
我們來看如下例子:
$a = 1; $b = 2; function test() { global $a, $b; } test();
當我們執行test()函式時,在記憶體中變數的狀態是什麼樣的呢?如下圖所示
我們聲明瞭test函式,當呼叫test()函式時,global會在函式中宣告兩個區域性變數$a, $b,並且分別指向全域性變數$a和$b,此時的臨時變數$a和$b相當於全域性變數$a和$b的引用。所以我們在函式中修改區域性變數$a和$b的值就等同於修改了全域性變數的值。
$a = 1; $b = 2; function test() { global $a, $b; $a = 11; $b = 12; unset($a); unset($b); } test(); echo $a; echo '<br>'; echo $b;
瀏覽器上列印輸出:
上面的程式碼中還使用了unset(),通過echo輸出能輸出全域性變數$a, $b的值,這也說明test()函式裡通過global關鍵字宣告的$a和$b只是區域性變數,只是斷開了區域性變數與全域性變數的引用。
我們來看另一種情況,如果我們在test函式中宣告的變數在全域性變數中並沒有呢?
先說結論: 如果在函式中使用global關鍵字宣告的變數在全域性作用域並沒有同名變數,那麼會先建立同名全域性變數,再在函式中建立區域性變數,同時將全域性變數的引用指向區域性變數。
function test() { global $a, $b; $a = 11; $b = 22; unset($a); unset($b); } echo $a; echo '<br>'; echo $b;
通過瀏覽器輸出:
上面的程式碼,我們在test函式中使用global聲明瞭變數$a, $b,雖然全域性作用域並沒有宣告$a和$b,但是global依然會先建立全域性變數$a和$b,然後在test函式中建立$a, $b,然後把全域性變數的引用指向test函式的區域性變數。所以即使我們在函式中unset了$a和$b,在函式執行完成後我們依然能打印出$a和$b,因為全域性變數中已經存在著兩個變量了。
所以我們最終可以對得出如下結論:
在函式中使用global宣告變數時,會先在全域性作用域查詢是否有同名變數,如果有則將該全域性變數的引用指向使用global宣告的同名區域性變數。如果全域性作用域沒有同名變數,那麼就先建立同名全域性變數,再建立區域性變數,然後把全域性變數的引用指向區域性變數。