为什么字符串*递推*出现在输出和每一个包含数组名称在$ GLOBALS数组输出与下划线开始? [重复]

问题描述 投票:3回答:1

这个问题已经在这里有一个答案:

我用我的本地机器下面的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)**?

php arrays recursion global-variables
1个回答
1
投票

想起来最简单的方法是通过想象如何,如果*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,因为它是变量的“实际”的名字。

© www.soinside.com 2019 - 2024. All rights reserved.