当打印$ GLOBALS时,"* RECURSION *"是什么意思?

9
当我使用以下代码打印$GLOBALS时:
<?php print_r($GLOBALS); ?>

我得到了这个输出:
数组([_GET] => Array()[_POST] => Array()[_COOKIE] => Array()[_FILES] => Array()[GLOBALS] => Array *RECURSION*)
在这种情况下,“* RECURSION *”是什么意思?为什么没有打印出$ _SERVER,$ _REQUEST等?
2个回答

4

请参见PHP手册中的此部分

Keep in mind that $GLOBALS is, itself, a global variable. So code like this won't work:

<?php
    print '$GLOBALS = ' . var_export($GLOBALS, true) . "\n";
?>

This results in the error message: "Nesting level too deep - recursive dependency?"

你已经检索到了整个列表 - 你只是无法显示其中的一部分(包含递归的部分),因为你会超时而不是得到有意义的结果。
当涉及到 $_REQUEST 时,它是从 $_GET$_POST$_COOKIE 派生出来的,因此它的内容是冗余的。 编辑: 有一个旧的 bug/特性,似乎在访问 $GLOBALS 时会用 $_SERVER$_REQUEST 填充它。所以尝试访问 $_REQUEST 并希望它有所帮助。无论如何,在那之后可以在 $GLOBALS 中找到它:ideone.com/CGetH

我已经查看了那部分内容。我的问题是,当它输出_POST等时,至少在单次运行中,它可能还需要发布$ _REQUEST,$ _SERVER? - swapnesh
@swapnesh:有一个旧的 bug / 特性,似乎会在访问 $_SERVER$_REQUEST 时将其填充到 $GLOBALS 中。因此,尝试访问 $_REQUEST 并希望它有所帮助。无论如何,在那之后可以在 $GLOBALS 中找到它:http://ideone.com/CGetH - Tadeck
将这加入到你的答案中,然后我会接受它...感谢提供信息兄弟 :) - swapnesh
1
@swapnesh:没问题,很高兴能帮上忙。我已经将它复制粘贴到我的回答中 ;) - Tadeck
有没有一种方法只打印RECURSION数组的值? - Dewlance

2

$GLOBALS 包含自身作为一个数组。在PHP参考手册中,您可以找到$GLOBALS的定义:

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

因此,$GLOBALS必须包含它自己,这导致了递归。

其他数组可能只是空的,因为在您的脚本中没有其他事情发生。

有一个关于递归的老笑话:“要理解递归,你必须理解递归”。

顺便说一下:在我的计算机上,它输出了_SERVER。


2
哈...我刚刚发现PHP本身是一个递归缩写词,因为它代表PHP超文本预处理器...以前从未注意过。被维基百科效应影响了 :-) http://xkcd.com/214/ - ChaosCakeCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接