理解PHP $ GLOBALS变量

时间:2017-01-07 18:00:26

标签: php arrays global-variables global superglobals

我正在从 w3schools'中学习 PHP PHP教程

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

好奇地了解" Superglobals"更深入地我编写了以下代码并在我的本地机器上的浏览器中执行它(ielocalhost):

<!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数组的目的是存储用户全局声明的变量,那么这个数组是如何预先填充其他一些值的,因为我还没有在我的代码中声明任何全局变量? / LI>

    注意:我在我的计算机上使用&#34; Microsoft Windows 10 Home Single Language&#34; 操作系统。它是一个 64位操作系统。我使用最新版本的 XAMPP PHP 7.0.13 HTTP Apache Web服务器v.2.4.23 来运行程序本地。另请注意,我的代码中没有将任何其他变量定义为全局变量或本地变量。

4 个答案:

答案 0 :(得分:3)

从我对PHP的了解和做一些研究以及在多个操作系统上进行测试&#39;使用各种版本的PHP我发现了以下内容。

问题1&amp; 3:

是的,对于9个超长球而言你是正确的,但要记住的一件非常重要的事情是$GLOBALS - 引用全局范围内可用的所有变量。

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

由于$ GLOBALS包含对包括其自身在内的所有其他超全局的引用这一事实,当我们print_r($ GLOBALS)时,它还将包括输出中的其他超全局。因为$ GLOBALS也引用了自己,所以我们得到了你在第3点中提到的RECURSION。您可以将其视为包含$ GLOBALS的无限维数组。与infinte循环几乎相同的想法。

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

相反,脚本会看到这个并停止执行并只打印RECURSION。现在我已经在3种不同的环境中对它进行了测试,并且每次打印超大球的顺序都发生了变化,但是一旦达到$ GLOBALS,它就会停止并打印RECURSION。

问题2:

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

问题4:

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

Description in the PHP.net manual

  

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

要查看所有超级全球,您必须单独print_r()每个超级球。

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

编辑以回应用户评论

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

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

Link to What References Are in PHP

  

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

     

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

答案 1 :(得分:0)

$GLOBALS是所有超级全局变量和用户定义变量的全局变量。例如,如果您在$a = 10;数组中声明了变量$GLOBALS,则您有key =&gt;值对,其中key为a且值为10.如果您想从$GLOBALS获取某些内容你只需要把它写成数组键。

例如

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

在上面的示例中,输出将是$a所以25;

的值

在您的示例toWorkNormally=>1中,它表示您已将名称设置为workNormally且值为1或true的cookie

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

答案 2 :(得分:0)

PHP手册说明了$GLOBALS变量的以下内容:

  

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

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

您正在谈论的RECURSION是引用自身的$GLOBALS变量。由于我们不希望PHP在此过程中无休止地输出相同的输出并使服务器崩溃,因此如果出现这种情况,则会有内置的故障保护功能向您显示RECURSION警报。

我想补充说$GLOBALS是一个超全局或预设的全局变量。这意味着它可以在整个脚本的所有范围内使用。

资源

答案 3 :(得分:0)

<强> 1。根据我在PHP中的知识,有九种类型的超全局(预定义的PHP全局变量)即。 $ GLOBALS,$ _SERVER,$ _REQUEST,$ _POST,$ _GET,$ _FILES,$ _ ENV,$ _COOKIE和$ _SESSION然后我怀疑是预定义全局数组$ GLOBALS的数组元素是什么。 [_GET],[_ POST],[_ COOKIE],[_ FINILES]意味着他们有自己独立存在的超级全局?

来自PHP's doc

  

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

这意味着您可以直接访问superglobal $GLOBALS,是的,您有两种方法可以访问它们。

<强> 2。什么是[toWorkNormally] =&gt; 1从上面的数组输出?
它在$ _COOKIE里面,所以有一个名为toWorkNormally的cookie,其值为1More info on cookies

<强> 3。 RECURSION在元素[GLOBALS]中的含义是什么以及如何打印这些元素? Recursion表示它自己引用,如果它被打印,那么它会再次显示嵌套在$GLOBALS内的GLOBALS的内容,这将导致无限循环。为了避免PHP只是改为打印*RECURSION*

<强> 4。因为$ GLOBALS数组的目的是存储用户全局声明的变量,那么这个数组是如何预先填充其他一些值的,因为我没有在我的代码中声明任何全局变量? < / p>

来自PHP's doc

  

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

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