Was ist der Unterschied zwischen getenv()
und$_ENV
?
Irgendwelche Kompromisse zwischen der Verwendung von beidem?
Mir ist aufgefallen, dass ich manchmal getenv()
das bekomme, was ich brauche, während ich $_ENV
es nicht tue (wie HOME
).
Was ist der Unterschied zwischen getenv()
und$_ENV
?
Irgendwelche Kompromisse zwischen der Verwendung von beidem?
Mir ist aufgefallen, dass ich manchmal getenv()
das bekomme, was ich brauche, während ich $_ENV
es nicht tue (wie HOME
).
Antworten:
Laut der PHP-Dokumentation zu getenv sind sie genau gleich, außer dass getenv
die Variable ohne Berücksichtigung der Groß- und Kleinschreibung gesucht wird. Meistens spielt es wahrscheinlich keine Rolle, aber einer der Kommentare in der Dokumentation erklärt:
Unter Windows ist $ _SERVER ['Pfad'] beispielsweise so, wie Sie sehen, wobei der erste Buchstabe groß geschrieben wird und nicht 'PATH', wie Sie es vielleicht erwarten.
Aus diesem Grund würde ich mich wahrscheinlich für die Verwendung entscheiden, es getenv
sei denn, Sie sind sich sicher, dass der Titel der Variablen, die Sie abrufen möchten, in Groß- und Kleinschreibung geschrieben ist.
getenv()
Vorteil: Sie müssen isset
/ empty
vor dem Zugriff nicht überprüfen . getenv()
wird keine Mitteilungen ausgeben.
Ich weiß, dass der Kommentar in den Dokumenten besagt, dass getenv
die Groß- und Kleinschreibung nicht berücksichtigt wird, aber das ist nicht das Verhalten, das ich sehe:
> 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
Wenn Sie sich den Quellcode für die getenv
Funktion ansehen, gibt es drei Möglichkeiten, wie PHP die Umgebungsvariable abrufen kann:
sapi_getenv
(z. B. wenn die Umgebungsvariable von Apache abgerufen wird)GetEnvironmentVariableA
.getenv
von libc
.Soweit ich das beurteilen kann, verhält sich Windows nur dann ohne Berücksichtigung der Groß- und Kleinschreibung, da sich die Windows-API für Umgebungsvariablen so verhält. Wenn Sie unter Linux, BSD, Mac usw. arbeiten, getenv
wird immer noch zwischen Groß- und Kleinschreibung unterschieden.
Wie von Mario erwähnt , $_ENV
wird es aufgrund unterschiedlicher Konfigurationen nicht immer ausgefüllt.variables_order
Vermeiden $_ENV
Sie es daher, wenn Sie die Serverkonfiguration nicht steuern.
Also, für den portabelsten PHP-Code:
getenv
.Darüber hinaus $_ENV
ist in der Regel leer, wenn variables_order
nicht E
aufgeführt. Bei vielen Setups ist es wahrscheinlich, dass nur diese $_SERVER
ausgefüllt sind und $_ENV
ausschließlich für die CLI-Verwendung bestimmt sind.
Zum anderen wird getenv()
direkt auf die Umgebung zugegriffen.
(In Bezug auf die Fallmehrdeutigkeit könnte man einfacher verwenden array_change_key_case()
.)
Ich fand es getenv()
nützlich, einen seltsamen PHP-Fehler zu vermeiden, bei dem manchmal $_SERVER
und $_ENV
undefiniert, wenn er auto_globals_jit
aktiviert war (Erstellen der Variablen _SERVER und _ENV , wenn sie zum ersten Mal verwendet werden). Seitdem habe ich angefangen, es zu benutzen.
Entnommen aus den PHP-Dokumenten :
Diese Funktion ist nützlich (im Vergleich zu
$_SERVER
,$_ENV
), da sie den Schlüssel $ varname auf diese Weise durchsucht, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird. Unter Windows sehen$_SERVER['Path']
SiePATH
beispielsweise so, als würden Sie Großschreibung sehen, nicht wie erwartet. Also nur:<?php getenv('path') ?>
Ich würde hinzufügen, dass getenv () eine bessere Wahl ist, da es als Funktion zu Testzwecken überladen werden kann. Während das Überschreiben Ihrer $ _SERVER- oder $ _ENV-Variablen möglicherweise Testframeworks und andere Bibliotheken beeinträchtigt und letztendlich viel mehr Arbeit erfordert, um sicher ausgeführt zu werden.
$_ENV
und$_SERVER
werden mit Daten gefüllt, die auf verschiedene Weise erhalten wurden.getenv()
ist eine weitere Möglichkeit, auf Daten zuzugreifen, auf die Sie mit PHP nicht direkt zugreifen können. Es funktioniert auch mitvariables_order = "G"
, wenn$_SERVER
und$_ENV
leer sind. Lesen Sie die großartige Antwort von Conor McDermottroe .