任何函数或类之外的范围都是全局范围。当PHP脚本包含另一个脚本(使用include或require)时,范围保持不变。如果脚本包含在任何函数或类的外部,则其全局变量包含在同一全局范围内,但是如果脚本包含在函数内部,则所包含脚本中的变量位于函数的范围内。
在函数或类方法的范围内,global关键字可以用于创建访问用户定义的全局变量。
<?php $amount_of_log_calls = 0; function log_message($message) { // 从函数范围访问全局变量 // 需要这个明确的陈述 global $amount_of_log_calls; // 对全局变量的更改是永久的 $amount_of_log_calls += 1; echo $message; } // 在全局范围内时,可以使用常规全局变量 // 没有明确说明“全局$variable”; echo $amount_of_log_calls; // 0 log_message("第一条日志消息!"); echo $amount_of_log_calls; // 1 log_message("第二条日志消息!"); echo $amount_of_log_calls; // 2
从全局范围访问变量的第二种方法是使用特殊的PHP定义的$GLOBALS数组。
$GLOBALS数组是一个关联数组,其全局变量的名称为键,该变量的内容为该数组元素的值。注意$GLOBALS在任何范围内如何存在,这是因为$GLOBALS是一个超全局变量。
这意味着该log_message()函数可以重写为:
function log_message($message) { // 通过访问全局$amount_of_log_calls变量 //$GLOBALS数组。不需要'global $GLOBALS;',因为它 // 是一个超全局变量。 $GLOBALS['amount_of_log_calls'] += 1; echo $messsage; }
有人会问,为什么同时使用global关键字$GLOBALS来获取全局变量的值呢?主要原因是使用global关键字会将变量带入范围。然后,您将无法在本地范围内重用相同的变量名。