首頁  >  文章  >  後端開發  >  談PHP中的global全域變量

談PHP中的global全域變量

little bottle
little bottle轉載
2019-04-22 17:38:332973瀏覽

眾所周知,在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 &#39;<br>&#39;;
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 &#39;<br>&#39;;
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中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除