用户定义的全局变量

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