getenv () против $ ENV в PHP


в чем разница между getenv() и $_ENV?

любые компромиссы между использованием либо?

Я иногда замечал getenv() дает мне то, что мне нужно, в то время как $_ENV Не (например,HOME).

6 54

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 может получить переменную окружения:

  1. через sapi_getenv (например, если он получает переменную среды от Apache)
  2. если на Windows, от GetEnvironmentVariableA.
  3. если на не-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 может помешать тестовым фреймворкам и другим библиотекам и в конечном итоге потребует гораздо больше работы для безопасного выполнения.