$GLOBALS

(PHP 4, PHP 5, PHP 7, PHP 8)

$GLOBALS引用全局范围内可用的所有变量

描述

一个关联的 数组,包含对当前在脚本全局范围内定义的所有变量的引用。变量名称是数组的键。

示例

示例 #1 $GLOBALS 示例

<?php
function test() {
$foo = "局部变量";

echo
'$foo 在全局范围内: ' . $GLOBALS["foo"] . "\n";
echo
'$foo 在当前范围内: ' . $foo . "\n";
}

$foo = "示例内容";
test();
?>

上面的示例将输出类似于以下内容

$foo in global scope: Example content
$foo in current scope: local variable

警告

从 PHP 8.1.0 开始,不再支持对整个 $GLOBALS 数组进行写访问。

示例 #2 对整个 $GLOBALS 进行写入将导致错误。

<?php
// 生成编译时错误:
$GLOBALS = [];
$GLOBALS += [];
$GLOBALS =& $x;
$x =& $GLOBALS;
unset(
$GLOBALS);
array_pop($GLOBALS);
// ...以及任何其他对 $GLOBALS 的读写操作
?>

注释

注意:

这是一个“超级全局”或自动全局变量。这意味着它在整个脚本的所有范围内都可用。不需要在函数或方法中使用 global $variable; 来访问它。

注意: 变量可用性

与所有其他 超级全局变量 不同,$GLOBALS 本质上一直都在 PHP 中可用。

注意:

从 PHP 8.1.0 开始,$GLOBALS 现在是全局符号表的只读副本。也就是说,无法通过其副本修改全局变量。以前,$GLOBALS 数组被排除在 PHP 数组的通常按值行为之外,并且可以通过其副本修改全局变量。

<?php
// 在 PHP 8.1.0 之前
$a = 1;
$globals = $GLOBALS; // 表面上按值复制
$globals['a'] = 2;
var_dump($a); // int(2)

// 从 PHP 8.1.0 开始
// 这不再修改 $a。之前的行为违反了按值语义。
$globals = $GLOBALS;
$globals['a'] = 1;

// 要恢复之前的行为,请迭代其副本并将每个属性重新分配给 $GLOBALS。
foreach ($globals as $key => $value) {
$GLOBALS[$key] = $value;
}
?>

添加注释

用户贡献的注释 4 个注释

inafeeur at gmail dot com
1 年前
我们可以更清楚地说明给定示例的扩展。

PHP 版本 8.1 之前

<?php
$a
= 1;
$globals = $GLOBALS;
$globals['a'] = 2;
echo
$a; // 2
echo $globals['a']; // 2
echo $GLOBALS['a']; // 2
?>

PHP 版本 8.1 之后

<?php
$a
= 1;
$globals = $GLOBALS;
$globals['a'] = 2;
echo
$a; // 1
echo $globals['a']; // 2
echo $GLOBALS['a']; // 1
?>
therandshow at gmail dot com
13 年前
从 PHP 5.4 开始,$GLOBALS 现在是即时初始化的。这意味着现在不使用 $GLOBALS 变量是有优势的,因为您可以避免初始化它的开销。我不确定这有多大优势,但我一直不太喜欢 $GLOBALS。
mstraczkowski at gmail dot com
11 年前
当您尝试将 $GLOBALS 设置为局部变量时要小心。

即使没有使用引用运算符“&”,您的变量似乎也引用了 $GLOBALS。

您可以使用以下代码测试此行为

<?php
/**
* 结果:
* POST: B, 变量: C
* GLOBALS: C, 变量: C
*/

// 测试 $_POST
$_POST['A'] = 'B';

$nonReferencedPostVar = $_POST;
$nonReferencedPostVar['A'] = 'C';

echo
'POST: '.$_POST['A'].', 变量: '.$nonReferencedPostVar['A']."\n\n";

// 测试 Globals
$GLOBALS['A'] = 'B';

$nonReferencedGlobalsVar = $GLOBALS;
$nonReferencedGlobalsVar['A'] = 'C';

echo
'GLOBALS: '.$GLOBALS['A'].', 变量: '.$nonReferencedGlobalsVar['A']."\n\n";
vittorio.zamparella at famous googlemail
7 年前
我终于找到了关于超级全局变量在 $GLOBALS 中找不到的信息

https://bugs.php.net/bug.php?id=65223&edit=2
-------------------------------------
[2013-07-09 12:00 UTC] johannes @php.net
[...]超级全局变量(也称为自动全局变量)默认情况下不会添加到符号表中,以提高性能,除非解析器看到需要。例如

<?php
$_SERVER
;
print_r($GLOBALS);
?>

将会列出它。您也可以使用 php.ini 中的 auto_gloals_jit 来控制它:https://php.net/manual/en/ini.core.php#ini.auto-globals-jit
-------------------------------------

https://php.net/manual/en/language.variables.variable.php
-------------------------------------
警告
请注意,在函数或类方法中,不能将变量变量与 PHP 的超级全局数组一起使用。变量 $this 也是一个特殊变量,不能动态引用。
-------------------------------------
To Top