使用者定義的全域性變數
任何函式或類之外的範圍是全域性範圍。當 PHP 指令碼包含另一個(使用 include
或 require
)時,範圍保持不變。如果指令碼包含在任何函式或類之外,則它的全域性變數包含在同一全域性範圍內,但如果函式中包含指令碼,則包含的指令碼中的變數位於函式的範圍內。
在函式或類方法的範圍內,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
關鍵字會將變數帶入範圍。然後,你無法在本地範圍中重用相同的變數名稱。