В чем разница между getenv()
и $_ENV
?
Любые компромиссы между использованием:?
Я заметил, что иногда getenv()
дает мне то, что мне нужно, а $_ENV
не работает (например, HOME
).
В чем разница между getenv()
и $_ENV
?
Любые компромиссы между использованием:?
Я заметил, что иногда getenv()
дает мне то, что мне нужно, а $_ENV
не работает (например, HOME
).
Согласно php-документации о getenv, они точно такие же, за исключением того, что getenv
будет искать переменную без учета регистра. В большинстве случаев это, вероятно, не имеет значения, но в одном из комментариев к документации объясняется:
Например, в Windows $_SERVER [ "Путь" ], как вы видите, с заглавной буквой, а не "PATH", как вы могли ожидать.
Из-за этого я, вероятно, предпочел бы использовать getenv
, если вы не уверены в оболочке заголовка переменной, которую вы пытаетесь получить.
Я знаю, что комментарий в документах говорит, что getenv
не чувствителен к регистру, но это не то поведение, которое я вижу:
> env FOO=bar php -r 'print getenv("FOO") . "\n";'
bar
> env FOO=bar php -r 'print getenv("foo") . "\n";'
> env foo=bar php -r 'print getenv("foo") . "\n";'
bar
> env foo=bar php -r 'print getenv("FOO") . "\n";'
> php --version
PHP 5.4.24 (cli) (built: Jan 24 2014 03:51:25)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
Рассматривая исходный код для функции getenv
, это связано с тем, что PHP может получить переменную окружения:
sapi_getenv
(например, если он получает переменную окружения из Apache)GetEnvironmentVariableA
.getenv
предоставляется libc
.Насколько я могу судить, единственное время, когда он будет вести себя нечувствительным к регистру, - это Windows, потому что это поведение API переменных среды Windows. Если вы работаете в Linux, BSD, Mac и т.д., То getenv
все еще чувствителен к регистру.
Как упоминалось mario, $_ENV
не всегда заполняется из-за разных конфигураций variables_order
, поэтому лучше всего избегать $_ENV
, если вы не контролируйте конфигурацию сервера.
Итак, для самого портативного PHP-кода:
getenv
.Дополнительно $_ENV
обычно пуст, если variables_order
не имеет E
. На многих настройках вероятно, что заполняется только $_SERVER
, а $_ENV
- строго для использования CLI.
С другой стороны getenv()
напрямую обращается к среде.
(Что касается случая-двусмысленности, можно было бы просто использовать array_change_key_case()
.)
Я нашел getenv()
полезным, чтобы избежать странной ошибки PHP, где иногда $_SERVER
и $_ENV
не были определены, если auto_globals_jit
был включен (создание переменных _SERVER и _ENV при их первом использовании). С тех пор я начал им пользоваться.
Взято из PHP docs:
Эта функция полезна (по сравнению с
$_SERVER
,$_ENV
), потому что она ищет ключ $varname в этом режиме без учета регистра. Например, в Windows$_SERVER['Path']
, как вы ожидали, вы видите "заглавные", а не "PATH
". Так просто:<?php getenv('path') ?>
Я бы добавил, что getenv() - лучший выбор, потому что, как функция, он может быть перегружен для целей тестирования. В то время как перезапись ваших переменных $ _SERVER или $ _ENV может помешать тестовым средам и другим библиотекам и в конечном итоге потребует намного больше работы для безопасного выполнения.