getenv () против $ ENV в PHP
в чем разница между getenv()
и $_ENV
?
любые компромиссы между использованием либо?
Я иногда замечал getenv()
дает мне то, что мне нужно, в то время как $_ENV
Не (например,HOME
).
6 ответов:
по данным документация 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)- если на Windows, от
GetEnvironmentVariableA
.- если на не-Windows, от
дополнительно
$_ENV
обычно пусто, еслиvariables_order
не естьE
в списке. На многих установках вполне вероятно, что только$_SERVER
заполняется, и$_ENV
строго для использования CLI.С другой стороны
getenv()
доступ к среде напрямую.(Что касается случая-двусмысленность, можно было бы более просто использовать
array_change_key_case()
.)
взято с PHP docs:
эта функция полезна (по сравнению с
$_SERVER
,$_ENV
) потому что он ищет ключ $varname в этом массиве без учета регистра. Например на Windows$_SERVER['Path']
это как вы видите с заглавной буквы, а не'PATH
как вы и ожидали. Так что просто:<?php getenv('path') ?>
нашел
getenv()
полезно, чтобы избежать странный PHP баг где иногда$_SERVER
и$_ENV
было определено, еслиauto_globals_jit
был включен (создание _SERVER для и _ENV переменные, когда они впервые используются). С тех пор я начал им пользоваться.
Я бы добавил, что getenv () является лучшим выбором, потому что, как функция, она может быть перегружена для целей тестирования. В то время как перезапись переменных $_SERVER или $_ENV может помешать тестовым фреймворкам и другим библиотекам и в конечном итоге потребует гораздо больше работы для безопасного выполнения.