用户定义的全局变量
任何函数或类之外的范围是全局范围。当 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
关键字会将变量带入范围。然后,你无法在本地范围中重用相同的变量名称。