眾所周知,在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;
瀏覽器上列印輸出:
11 22
上面的程式碼中也使用了unset(),透過echo輸出能輸出全域變數$a, $b的值,這也說明test ()函數裡透過global關鍵字宣告的$a和$b只是局部變量,unset()只是斷開了局部變數與全域變數的參考。
我們來看另一種情況,如果我們在test函數中宣告的變數在全域變數中並沒有呢?
先說結論:如果在函數中使用global關鍵字聲明的變數在全域作用域並沒有同名變量,那麼會先創建同名全域變量,再在函數中創建局部變量,同時將全域變數的引用指向局部變數。
function test() { global $a, $b; $a = 11; $b = 22; unset($a); unset($b); } echo $a; echo '<br>'; echo $b;
透過瀏覽器輸出:
11 22
上面的程式碼,我們在test函數中使用global宣告了變數$a, $b,雖然全域作用域並沒有宣告$ a和$b,但是global還是會先創建全域變數$a和$b,然後在test函數中創建$a, $b,然後把全域變數的引用指向test函數的局部變數。所以即使我們在函數中unset了$a和$b,在函數執行完成後我們依然能印出$a和$b,因為全局變數中已經存在著兩個變數了。
所以我們最終可以對得出如下結論:
在函數中使用global宣告變數時,會先在全域作用域中尋找是否有同名變量,如果有則將該全域變數的引用指向使用global宣告的同名局部變數。如果全域作用域沒有同名變量,那麼就先建立同名全域變量,再建立局部變量,然後把全域變數的引用指向局部變數。
相關教學:PHP影片教學
#以上是談PHP中的global全域變量的詳細內容。更多資訊請關注PHP中文網其他相關文章!