使用者定義的全域性變數

任何函式或類之外的範圍是全域性範圍。當 PHP 指令碼包含另一個(使用 includerequire )時,範圍保持不變。如果指令碼包含在任何函式或類之外,則它的全域性變數包含在同一全域性範圍內,但如果函式中包含指令碼,則包含的指令碼中的變數位於函式的範圍內。

在函式或類方法的範圍內,global 關鍵字可用於建立訪問使用者定義的全域性變數。

<?php

$amount_of_log_calls = 0;

function log_message($message) {
    // Accessing global variable from function scope
    // requires this explicit statement
    global $amount_of_log_calls;

    // This change to the global variable is permanent
    $amount_of_log_calls += 1;

    echo $message;
}

// When in the global scope, regular global variables can be used
// without explicitly stating 'global $variable;'
echo $amount_of_log_calls; // 0

log_message("First log message!");
echo $amount_of_log_calls; // 1

log_message("Second log message!");
echo $amount_of_log_calls; // 2

從全域性範圍訪問變數的第二種方法是使用特殊的 PHP 定義的$ GLOBALS 陣列。

$ GLOBALS 陣列是一個關聯陣列,全域性變數的名稱是鍵,該變數的內容是陣列元素的值。注意$ GLOBALS 在任何範圍內是如何存在的,這是因為$ GLOBALS 是一個超全域性。

這意味著 log_message() 功能可以重寫為:

function log_message($message) {
    // Access the global $amount_of_log_calls variable via the
    // $GLOBALS array. No need for 'global $GLOBALS;', since it
    // is a superglobal variable.
    $GLOBALS['amount_of_log_calls'] += 1;

    echo $messsage;
}

有人可能會問,為什麼在 global 關鍵字也可用於獲取全域性變數的值時使用$ GLOBALS 陣列?主要原因是使用 global 關鍵字會將變數帶入範圍。然後,你無法在本地範圍中重用相同的變數名稱。