PHP - $GLOBALS
$GLOBALS 是 PHP 中的一种 "超全局" 或 "自动全局" 变量。它在整个脚本的所有作用域中都可用。在函数或方法中访问它时,无需执行 "global $variable;"。
$GLOBALS 是一个包含所有全局定义变量引用的关联数组。变量名构成键,它们的值是关联数组的值。
使用 $GLOBALS 访问全局变量
此示例展示了 $GLOBALS 数组包含全局变量的名称和内容 —
<?php $var1="Hello"; $var2=100; $var3=array(1,2,3); echo $GLOBALS["var1"] . "\n"; echo $GLOBALS["var2"] . "\n"; echo implode($GLOBALS["var3"]) . "\n"; ?>
输出
它将产生以下结果 —
Hello 100 123
使用 $GLOBALS 比较全局变量与局部变量
在以下示例中,$var1 在全局命名空间中定义,同时也在函数内部作为局部变量定义。从 $GLOBALS 数组中提取全局变量。
<?php
function myfunction() {
$var1="Hello PHP";
echo "var1 in global namespace: " . $GLOBALS['var1']. "\n";
echo "var1 as local variable: ". $var1;
}
$var1="Hello World";
myfunction();
?>
输出
它将产生以下结果 —
var1 in global namespace: Hello World var1 as local variable: Hello PHP
修改全局变量
在 PHP 8.1.0 版本之前,可以通过 $GLOBALS 数组的副本来修改全局变量。
<?php $a = 1; $globals = $GLOBALS; $globals['a'] = 2; var_dump($a); ?>
输出
它将产生以下输出 —
int(1)
这里,$globals 是 $GLOBALS 超全局变量的副本。将副本中键为 "a" 的元素改为 2,实际上会改变 $a 的值。
它将产生以下输出 —
int(2)
只读 $GLOBALS
从 PHP 8.1.0 开始,$GLOBALS 是全局符号表的只读副本。也就是说,无法通过其副本来修改全局变量。上述相同操作不会将 $a 改为 2。
<?php $a = 1; $globals = $GLOBALS; $globals['a'] = 2; var_dump($a); ?>
输出
它将生成以下输出 —
int(1)
在函数内部更新全局变量
在以下示例中,全局变量 $counter 将通过 $GLOBALS 在函数中直接更新。每次函数调用都会将值递增 1。
<?php
$counter = 0;
function incrementCounter() {
$GLOBALS['counter']++;
}
incrementCounter();
incrementCounter();
incrementCounter();
echo "Counter value: " . $counter;
?>
输出
以上代码的输出如下 —
Counter value: 3
在嵌套函数中使用 $GLOBALS
在以下示例中,我们在嵌套函数内部使用 $GLOBALS。因此,通过此示例,你甚至可以在嵌套函数中使用全局变量。
<?php
$var = "Hello";
function outerFunction() {
function innerFunction() {
echo $GLOBALS['var'] . " from inner function!";
}
innerFunction();
}
outerFunction();
?>
输出
以上代码的输出如下 —
Hello from inner function!
将数组存储在全局变量中
在以下示例中,$GLOBALS 允许你直接更改存储为全局变量的数组。我们示例中的函数向数组添加新项。
<?php
$var = array("Apple", "Banana");
function addFruit($fruit) {
$GLOBALS['var'][] = $fruit;
}
addFruit("Orange");
addFruit("Grapes");
print_r($var);
?>
输出
以上代码的输出如下 —
Array ( [0] => Apple [1] => Banana [2] => Orange [3] => Grapes )