Я знаю, что комментарий в документации говорит, что 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)
- Если в Windows, с
GetEnvironmentVariableA
.
- Если используется не Windows, из функции
getenv
, предоставляемой libc
.
Насколько я могу судить, единственный случай, когда он будет вести себя без учета регистра, в Windows, потому что именно так ведет себя API-переменная среды Windows. Если вы используете Linux, BSD, Mac и т. Д., То getenv
по-прежнему чувствителен к регистру.
Как указано mario , $_ENV
не всегда заполнен из-за различных конфигураций variables_order
, поэтому лучше избегать $_ENV
, если вы не управляете конфигурацией сервера.
Итак, для самого переносимого кода PHP:
- Использование
getenv
.
- Используйте правильный регистр для имени переменной среды.