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

为什么PHP需要递归地存储相同的全局数据?,php,superglobals,Php,Superglobals,以下是随机变量转储($GLOBALS)的结果: 我是PHP新手,不明白为什么PHP需要这么做?它不会占用更多的存储空间吗?php中的$GLOBALS数组描述了包含所有变量的范围。有趣的是,$GLOBALS是指向键控变量数组的指针。。。包含在范围内! 因此,php不存储该数组的副本(实际上需要无限内存),但它只在数组本身中保存指向该数组的指针,以便程序员可以迭代包含所有现有变量的数组。因为根据定义,$GLOBALS是一个全局变量;因为它包含了所有的全局变量,所以将自身包含在其中是有意义的。递归在这

以下是随机
变量转储($GLOBALS)
的结果:


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

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

因为根据定义,
$GLOBALS
是一个全局变量;因为它包含了所有的全局变量,所以将自身包含在其中是有意义的。递归在这些概念的定义中


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

递归对象可能非常便宜,它们不是副本,只是指向其他对象的指针。。因此它不会浪费内存。实际上没有名为
$\u GLOBALS
的变量。它是
$GLOBALS
,如输出中所示。@Dan:阅读下面的两个答案。“将自身包含在其中是有意义的”另一方面,我想不出任何情况下您实际上需要通过自身访问它。从定义上讲,这是愚蠢的。@LightnessRacesinOrbit我同意,对于最终用户来说,它不是很有用,除非您只需要每个全局的名称(比如通过列出
$GLOBALS
)。然后可能是为了完整性而添加了对它的访问,或者是我不知道的其他一些内部原因。谢谢你对名字的更正!我想如果我是PHP的负责人,在绞死自己之后,我会得出这样的结论:这是一个50/50的折衷方案,最终可能会得到当前的解决方案,纯粹是为了一致性。@sidyll那么,这是PHP本身的问题吗?没有真正的理由这样做吗?@Dan这不是一个问题,正如上面所讨论的,可能只是为了完整性
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"
    }
}