我正在学习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*
)
上述输出在我心中产生了许多疑问,如下所示:
- 根据我在PHP中的知识superglobals(预定义的PHP全局变量),即
$GLOBALS, $_SERVER, $_REQUEST, $_POST, $_GET, $_FILES, $_ENV, $_COOKIE
和$_SESSION
,那么我的疑问是预定义全局数组中的数组元素是什么$GLOBALS
即[_GET], [_POST], [_COOKIE], [_FILES]
他们作为超级地球人的独立存在 - 上面的数组输出中的
[toWorkNormally] => 1
是什么意思 - 元素
[GLOBALS]
中的RECURSION是什么意思以及如何打印那些元素 - 由于
$GLOBALS
数组的目的是全局存储用户声明的变量,那么由于我在代码中没有声明任何全局变量,这个数组是如何预先填充一些其他值的呢
注意:我在机器上使用"Microsoft Windows 10 Home Single Language">操作系统。这是一个64位操作系统。我使用最新版本的XAMPP和PHP 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中的预定义变量以及手动设置的值。