这个问题已经在这里有一个答案:
我用我的本地机器下面的PHP版本,并从本地主机只有PHP程序。
PHP 5.3.10-1ubuntu3.13 with Suhosin-Patch (cli) (built: Jul 7 2014 18:54:55)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
我写了一个非常简单的PHP程序如下:
<!DOCTYPE html>
<html>
<body>
<?php
$x = 5;
$y = 10;
print_r($GLOBALS);
die;
function myTest() {
global $x, $y;
$y = $x + $y;
}
myTest(); // Run function
echo $y; // Output the new value for variable $y
?>
</body>
</html>
执行上述程序我得到以下在浏览器窗口后输出:
Array ( [GLOBALS] => Array *RECURSION* [_POST] => Array ( ) [_GET] => Array ( ) [_COOKIE] => Array ( ) [_FILES] => Array ( ) [x] => 5 [y] => 10 )
从上面的输出我没有得到为什么找上显示的字符串递归,从那里来的。什么是其背后的原因是什么?
另外,为什么是下划线出现在所有的开头包含数组**(_ POST,_GET,_FILES)**?
想起来最简单的方法是通过想象如何,如果*RECURSIVE*
不会一直显示这本来是:
Array
(
[GLOBALS] => Array
(
[GLOBALS] = Array
(
[GLOBALS] = Array
(
...
)
...
)
[_POST] => Array ( )
[_GET] => Array ( )
...
)
[_POST] => Array ( )
[_GET] => Array ( )
[_COOKIE] => Array ( )
[_FILES] => Array ( )
[x] => 5
[y] => 10
)
$GLOBALS
包含了所有的全局变量的引用,并且因为$GLOBAL
是一个全局变量本身,它也包含对自身的引用。正如可以看到的,上面将导致递归模式,这永远不会结束,仅仅是因为$GLOBALS
阵列含有作为元件本身的引用。这意味着,print_r()
打印这将是不可能的,因为这将导致无限递归。因此,print_r()
功能通过添加字符串*RECURSION*
而不是解决这个问题。下面是来自PHP-manual报价:
之前PHP 4.0.4,的print_r()将永远如果给包含对自身的直接或间接引用的数组或对象继续。一个例子是的print_r($ GLOBALS),因为$ GLOBALS是本身包含对自身的引用的全局变量。
这也意味着,显示其中包含自己递归引用任何对象将导致显示此字符串。一个简单的例子是:
$a = array(&$a); //$a contains one element with a reference to itself
print_r($a); //prints: Array ( [0] => Array ( [0] => Array *RECURSION* ) )
但请注意这不会隐瞒你什么信息 - 你还知道什么GLOBALS
元素包含(同样的事情,印刷,基本上),如果有这一切都记在心里。
要回答你的第二个问题:原因的名字开始,并强调很简单,因为几个“超级全局”变量这样做。这使得它更容易从常规变量区分超级全局和(有点)阻止人们错误地使用这些名称。所以访问_POST
阵列例如当你使用$_POST
,而不是仅仅$POST
,这意味着在$GLOBALS
可变元素键变成_POST
,因为它是变量的“实际”的名字。