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