为什么PHP需要递归地存储相同的全局数据?

时间:2016-05-07 17:17:09

标签: php superglobals

以下是随机var_dump($GLOBALS)

的结果
array(6) {
    ["_GET"] => array(0) {}
    ["_POST"] => array(0) {}
    ["_COOKIE"]=> array(1) {
        ["PHPSESSID"]=> string(26) "o8f2mggog45mq9p5ueafgu5hv6"
    }
    ["_FILES"] => array(0) {}
    ["GLOBALS"] => array(6) {
        ["_GET"] => array(0) {}
        ["_POST"] => array(0) {}
        ["_COOKIE"] => array(1) {
            ["PHPSESSID"] => string(26) "o8f2mggog45mq9p5ueafgu5hv6"
        }
        ["_FILES"] => array(0) {}
        ["GLOBALS"]=>
        *RECURSION*
        ["_SESSION"]=> &array(1) {
            ["somestrings"]=> string(16) "someotherstrings"
        }
    }
    ["_SESSION"] => &array(1) {
        ["somestrings"] => string(16) "someotherstrings"
    }
}

我是PHP的新手,不明白为什么PHP需要这样做?它会不会使用更多存储空间?

2 个答案:

答案 0 :(得分:3)

因为根据定义,$GLOBALS全局变量;并且由于它包含所有全局变量,因此将其自身包含在其中是有意义的。递归是这些概念的定义。

不,它不使用更多存储空间,因为它是指向自身的指针。如果以递归方式使用自身的副本,则会耗尽内存。

答案 1 :(得分:2)

php中的$GLOBALS数组描述了包含所有变量的范围。有趣的是$GLOBALS是指向范围内包含的键控变量数组的指针! 因此,php不存储该数组的副本(实际上需要无限的内存),但它只是在数组本身中保存了一个指向该数组的指针,因此程序员可以迭代包含所有现有变量的数组。