В чем разница между 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 может помешать тестовым средам и другим библиотекам и в конечном итоге потребует намного больше работы для безопасного выполнения.