Согласно http://www.php.net/manual/en/reserved.variables.globals.php :
Ассоциативный массив, содержащий ссылки на все переменные, которые в настоящее время определены в глобальной области действия сценария.
Итак, следующий код должен отображать, что $ GLOBALS var имеет _SERVER
, _ENV
(если он включен в переменных_order в php.ini) и клавиши _REQUEST
:
var_dump($GLOBALS);
Результат:
_SERVER
, _ENV
, _ENV
_ENV
, _ENV
Хм .. может быть, есть что-то в документах об этом поведении? Я просматривал каждую страницу для каждой переменной:
_SERVER
: http://www.php.net/manual/en/reserved.variables.server.php _ENV
: http://www.php.net/manual/en/reserved.variables.request.php _REQUEST
: http://www.php.net/manual/en/reserved.variables.request.php И я не нашел упоминаний о таком поведении. Почему это так работает?
Я установил php с помощью debian пакета с http://www.dotdeb.org/ repo (ничего не было скомпилировано вручную) … В настоящее время работает с nginx + php5-fpm. Это ошибка php?
Я создал ошибку на веб-сайте php.net, и команда php ответила: https://bugs.php.net/bug.php?id=65223
Резюме:
Это не ошибка. супер-глобальные (так называемые автоматические глобальные) не добавляются в таблицы символов по умолчанию по соображениям производительности, если парсер не видит необходимости. т.е.
<?php $_SERVER; print_r($GLOBALS); ?>
перечислит его. Вы также можете управлять этим с помощью auto_globals_jit в php.ini: http://www.php.net/manual/en/ini.core.php#ini.auto-globals-jit
Спасибо php team, так ответьте так быстро!