了解PHP$GLOBALS变量



我正在学习w3schools的PHP教程中的PHP

在学习PHP时,我遇到了预定义全局变量的概念,即Superglobals。

为了更深入地理解"超级全局",我编写了以下代码,并在本地机器(即localhost)的浏览器中执行:

<!DOCTYPE html>
<html>
<body>
<?php
echo "<pre>";
print_r($GLOBALS);
echo "</pre>";
?>
</body>
</html>

我在浏览器中得到了以下输出:

Array
(
[_GET] => Array
(
)
[_POST] => Array
(
)
[_COOKIE] => Array
(
[toWorkNormally] => 1
)
[_FILES] => Array
(
)
[GLOBALS] => Array
*RECURSION*
)

上述输出在我心中产生了许多疑问,如下所示:

  1. 根据我在PHP中的知识superglobals(预定义的PHP全局变量),即$GLOBALS, $_SERVER, $_REQUEST, $_POST, $_GET, $_FILES, $_ENV, $_COOKIE$_SESSION,那么我的疑问是预定义全局数组中的数组元素是什么$GLOBALS[_GET], [_POST], [_COOKIE], [_FILES]他们作为超级地球人的独立存在
  2. 上面的数组输出中的[toWorkNormally] => 1是什么意思
  3. 元素[GLOBALS]中的RECURSION是什么意思以及如何打印那些元素
  4. 由于$GLOBALS数组的目的是全局存储用户声明的变量,那么由于我在代码中没有声明任何全局变量,这个数组是如何预先填充一些其他值的呢

注意:我在机器上使用"Microsoft Windows 10 Home Single Language">操作系统。这是一个64位操作系统。我使用最新版本的XAMPPPHP 7.0.13以及HTTP Apache web服务器2.4.23在本地运行程序。另外,请注意,我在代码中没有将任何其他变量定义为全局或局部变量。

根据我对PHP的了解,我做了一些研究,并用不同版本的PHP在多个操作系统上进行了测试,发现了以下内容。

问题1&3:

是的,关于9个超级全局变量,您是正确的,但需要记住的一件非常重要的事情是$GLOBALS-References全局范围内所有可用的变量。

有趣的是,注意$GLOBALS是唯一一个不以下划线开头的超全局。

因为$GLOBALS包含对所有其他超全局的引用,包括它自己,所以当我们打印_r($GLOBALS)时,它也会在输出中包括其他超全局。因为$GLOBALS也引用了它自己,我们得到了你在第三点中询问的RECURSION。您可以将其视为包含$GLOBALS的无限维数组。几乎和中篇循环的想法一样。

[GLOBALS] => Array
(
[GLOBALS] => Array
(
[GLOBALS] => Array
(
...
)
)
)

相反,脚本看到这一点并停止执行,只打印RECURSION。现在我已经在3个不同的环境中测试了它,每次打印超级全局的顺序都会改变,但一旦它达到$GLOBALS,它就会停止并打印RECURSION。

问题2:

我在$_COOKIE[toWorkNormally] => 1上找不到任何信息。我想这是在其他地方设定的。我在任何测试中都没有看到。

问题4:

这既不正确也不正确。$GLOBALS的目的是而不是全局存储用户创建的所有变量。它只引用全局范围内所有可用的变量,包括超全局变量。这就是您在输出中看到所有其他超全局变量的原因。但是很多开发人员认为用户定义的全局变量存储在$GLOBALS中。

PHP.net手册中的说明

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

要查看所有超全局,您必须分别print_r()

要检查所有用户定义的全局变量,可以使用array_keys($GLOBALS),所有不是超全局的项很可能都是用户定义的全局变量。

编辑以回应用户评论

作为对你第一次评论的回应,不,他们没有什么不同。未打印的超全局变量仍然是数组的一部分,但执行/输出会停止,因为当它到达$GLOBALS时会碰到RECURSION。超级全局变量以随机顺序打印,并且在$GLOBALS之后的任何一个都不会被看到,因为它在$GLOBALS处检测到RECURSION并停止输出。

您可以使用print_r(array_keys($GLOBALS));检查所有超全局变量/全局变量。由于会话尚未启动,因此$_SESSION除外。print_r($_SESSION)将向您发出undefined variable $_SESSION通知。当您在打印之前放入session_start();时,您将能够看到$_SESSION。

链接到PHP 中的引用

PHP中的引用是通过不同名称访问相同变量内容的一种方法。

注意,在PHP中,变量名称和变量内容是不同的,因此相同的内容可以有不同的名称

PHP手册介绍了以下关于$GLOBALS变量的内容:

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

这准确地描述了变量的作用。它只是对现有变量的引用。

您所说的RECURSION是指代自身的$GLOBALS变量。由于我们不希望PHP无休止地输出相同的输出并在此过程中使您的服务器崩溃,因此有一个内置的故障保护,如果是这种情况,它会向您显示RECURSION警报。

我想补充一点,$GLOBALS是一个超全局变量,或预设全局变量。这意味着它在整个脚本的所有作用域中都可用。

资源

  • 关于$GLOBALS的PHP手册

$GLOBALS是所有超全局变量和用户定义变量的全局变量。例如,如果你在$GLOBALS数组中声明了变量$a = 10;,那么你就有了key=>value对,其中key是a,value是10。如果你想从$GLOBALS中得到一些东西,你只需要把它写为数组键。

示例

$a = 25;
echo $GLOBALS['a'];

在上面的例子中,输出将是$a的值,因此为25;

在您的示例toWorkNormally=>1中,这意味着您已将cookie的名称设置为WorkNormally,值为1或true

此外,当您在$GLOBALS['_GET']$GLOBALS['_POST']中使用get或post方法提交表格时,您可以从超级全局$_GET$_POST中找到您的表格数据

1。根据我在PHP中的知识,有九种类型的超全局变量(预定义的PHP全局变量),即$GLOBALS、$_SERVER、$_REQUEST、$_POST、$_GET、$_FILES、$_ENV、$_COOKIE和$_SESSION。那么我的疑问是,预定义的全局数组$GLOBALS中的数组元素,即[_GET]、[_POST]、[_COOKIE]、[_FILES],它们作为超全局变量独立存在,意味着什么

来自PHP的文档:

引用全局范围中可用的所有变量

这意味着您可以直接访问superglobal,也可以从$GLOBALS访问,是的,您有两种访问方式。


2.从上面的数组输出中,[toWorkNormaly]=>1是什么意思
它在$_COOKIE中,因此有一个名为toWorkNormally、值为1的COOKIE。有关cookie的更多信息


3.元素[GLOBALS]中的RECURSION是什么意思,以及如何打印这些元素 递归意味着它引用自己,如果它被打印出来,那么它将再次显示嵌套在GLOBALS中的$GLOBALS的内容,这将导致无限循环。为了避免这种情况,PHP只是打印了*RECURSION*


4.由于$GLOBALS数组的目的是全局存储用户声明的变量,那么由于我在代码中没有声明任何全局变量,这个数组是如何用其他值预先填充的呢

来自PHP的文档:

PHP中的几个预定义变量是"超级全局变量",这意味着它们在整个脚本的所有范围内都可用。没有必要做全局$variable;以便在函数或方法中访问它们。

换句话说,$GLOBALS将显示PHP中的预定义变量以及手动设置的值。

相关内容

  • 没有找到相关文章

最新更新