2016-05-07 8 views
3

Вот результат случайного var_dump($GLOBALS):Почему PHP должен рекурсивно хранить одни и те же глобальные данные?

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 нужно сделать? Не будет ли он использовать больше памяти?

+1

Рекурсивные объекты могут быть довольно дешевыми –

+0

они не копии, просто указатели на другие объекты .. поэтому он не теряет памяти. – supersan

+1

На самом деле нет переменной под названием '$ _GLOBALS'. Это '$ GLOBALS', как указано в выводе. –

ответ

3

Потому что по определению $GLOBALS является глобально переменная; и поскольку он содержит все глобальные переменные, имеет смысл содержать в себе. Рекурсия заключается в определении этих понятий.

И нет, он не использует больше хранилища, потому что это указатель на себя. Если бы он использовал рекурсивно экземпляр, у вас не хватило бы памяти.

+2

_ «имеет смысл содержать себя в нем». С другой стороны, я не могу думать о какой-либо ситуации, в которой вам действительно нужен доступ к ней через себя. По определению это было бы глупо. –

+0

@LightnessRacesinOrbit Я согласен, для конечного пользователя это не очень полезно, если вы не хотите просто имя каждого глобального (например, перечислив '$ GLOBALS'). Тогда, возможно, доступ к нему был добавлен для полноты или какой-то другой внутренней причины, о которой я не знаю. И спасибо за исправление имени! – sidyll

+1

Я думаю, что если бы я был ответственным за PHP, после того, как я повесил себя, я бы сделал вывод, что это 50/50 бросок и, вероятно, в конечном итоге с текущим решением чисто для согласованности. –

2

В массиве $GLOBALS в php описывается область, содержащая все переменные. Самое забавное, что $GLOBALS - это указатель на массив ключей с ключом ... содержащийся в области! Итак, php не хранит копию этого массива (на самом деле это требует бесконечной памяти), но просто сохраняет указатель на этот массив в самом массиве, поэтому программисты могут перебирать массив, содержащий все существующие переменные.