在所有的編程語言中,會有用到變量,而變量又為分局部變量和全局變量。當然在PHP動態網頁編程中也少不了變量的應用,今天變記錄一下,在PHP語言中全局變量的聲明與調用。

超全局變量$GLOBALS

国产视频app PHP超全局變量有很多,如下的都屬于超全局變量(Superglobal):

PHP中超全局變量$GLOBALS和global的區別

$GLOBALS,$_SERVER,$_GET,$_POST,$_FILES,$_COOKIE,$_SESSION,$_REQUEST,$_ENV。

官方說明:

$GLOBALS:引用全局作用域中可用的全部變量。一個包含了全部變量的全局組合數組。變量的名字就是數組的鍵。即出現過的全局變量,就可以通過$GLOBALS這個數組取得。PHP生命周期中,定義在函數體外部的所謂全局變量,函數內部是不能直接獲得的。

例子:

$a = "全局變量";
function b() {
    $a = "局部變量";
    echo '$a in current scope: ' . $a . "<br>";
    echo '$a in global scope: ' . $GLOBALS["a"] . "<br>";
}

如上的例子,要訪問外部的$a必須使用$GLOBALS數組。對于通過include文件進來的外部全局變量也適用。

php中global也有這樣的功能,它和$GLOBALS的區別在于:

global在函數產生一個指向函數外部變量的別名變量,而不是真正的函數外部變量。

国产视频app $GLOBALS[]確確實實調用是外部的變量,函數內外會始終保持一致。

對于類中的成員變量,類中函數必須使用$this->的方式訪問,不能用$GLOBALS方式:

全局變量global

global的作用是定義全局變量,但是這個全局變量不是應用于整個網站,而是應用于當前頁面,包括include或require的所有文件。

例:

function t1() {
    global $var1, $var2;
    $var2 = &$var1;
}
function t2() {
    $GLOBALS['var3'] = &$GLOBALS['var1'];
}
$var1 = 5;
$var2 = $var3 = 0;
t1();
print $var2 ."\n";
t2();
print $var3 ."\n";

執行結果為: 0  5

為什么不是2個5而是1個0和1個5呢?

再修改一下例子:

function t1() {
    global $var1;
    $var1 = 2;
    unset($var1);
}
function t2() {
    $GLOBALS['var1'] = 3;
    unset($GLOBALS['var1']);
}
$var1 = 1;
t1();
print $var1 . "\n";
t2();
print $var1 . "\n";

国产视频app 執行結果只輸出一個2;

国产视频app 1、$GLOBALS是由所有已定義全局變量自動形成的數組。變量名就是該數組的索引。即$GLOBALS['var1']與函數外部的變量$var1是同一個變量,所以將$GLOBALS['var1'] 刪除后,該變量已不存在,所有無法輸出了。

注:$GLOBALS是自動全局變量。這意味著它在所有的腳本中都有效。在函數或方法中不需要使用 global $GLOBALS; 來訪問它。

2、"global $var1;"是產生了函數外部$var1的別名變量"$var1",它不是真正的函數外部變量,他只存在于函數的內部,所以即使在函數內將別名變量刪除也不會影響外面的變量,但是可以修改函數外部變量的值。

或許有的人總想知道這個或那個的區別:在php程序,包括其他程序的學習中,自己動手實驗,根據結果加上的思考,有的時候比上網查找可能會來得更快一些,更準確一些。下面我們來講一下,php在全局范圍內訪問變量要怎么辦?

例一:global定義全局變量。

function test_global() {
    global $var1;
    $var1 = 'ok';
    unset($var1);
}
test_global();
$var2 = &$var1;
unset($var1);
echo $var2;

国产视频app 先不給出結果,自己運行一下程序。函數內部的變量可以訪問到了。從結果可以看出,unset只是斷開變量名與變量值連接,并沒有馬上銷毀變量的值,而且在函數內部定義的全局變量,實際在外部只是使用了函數內部的別名而已,所以我們在外面依然可以訪問$var1。

国产视频app 例二:$GLOBALS在函數內部訪問函數外面定義的變量。

$waibu = 'out';
function ff() {
    echo $GLOBALS['waibu'];
}
ff();

如果不加$GLOBALS,global直接在函數內部使用$waibu是會出錯的。