getenv () vs. $ ENV en PHP
Quelle est la différence entre getenv()
et $_ENV
?
Tout compromis entre l'utilisation de l'un ou l'autre?
J'ai remarqué parfois getenv()
me donne ce dont j'ai besoin, alors que $_ENV
ne le fait pas (comme HOME
).
6 réponses
Selon la documentation php sur la fonction getenv, ils sont exactement les mêmes, sauf que getenv
recherchera la variable dans une casse. La plupart du temps, il n'a probablement pas d'importance, mais l'un des commentaires sur la documentation explique:
Par exemple sur Windows $_SERVER ['Path'] est comme vous le voyez, avec la première lettre en majuscule, pas 'PATH' comme vous pouvez vous y attendre.
À cause de cela, je choisirais probablement d'utiliser getenv
sauf si vous êtes certain sur le boîtier du titre de la variable que vous essayez de récupérer.
Je sais que les commentaires de la doc dit que getenv
est insensible à la casse, mais c'est pas le comportement que je vois:
> 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
En regardant le code source pour la fonction getenv
, C'est parce QU'il y a trois façons dont PHP peut récupérer la variable d'environnement:
- Via
sapi_getenv
(par exemple s'il obtient la variable D'environnement D'Apache) - si sous Windows, à partir de
GetEnvironmentVariableA
. - si non-Windows, à partir de la fonction
getenv
fournie parlibc
.
Pour autant que je sache, le seul moment où il se comportera de manière insensible à la casse est sous Windows car c'est ainsi que se comporte L'API de la variable D'environnement Windows. Si vous êtes sous Linux, BSD, Mac, etc., getenv
est toujours sensible à la casse.
Comme mentionné par mario, $_ENV
n'est pas toujours rempli en raison de différentes configurations de variables_order
Il est donc préférable d'éviter $_ENV
Si vous ne contrôlez pas la configuration du serveur.
Donc, pour le plus portable Code PHP:
- utilisez
getenv
. - utilisez la casse correcte pour le nom de la variable d'environnement.
En Outre $_ENV
est généralement vide si variables_order
n'ont pas E
répertoriés. Sur de nombreuses configurations, il est probable que seulement $_SERVER
est rempli, et $_ENV
est strictement pour L'utilisation CLI.
D'autre part getenv()
accède directement à l'environnement.
(en ce qui concerne l'ambiguïté de cas, on pourrait plus simplement employer array_change_key_case()
.)
Cette fonction est utile (par rapport à
$_SERVER
,$_ENV
) parce qu'il recherche la clé $varname de manière insensible à la casse. Par exemple sur Windows$_SERVER['Path']
est comme vous voyez en majuscule, pas 'PATH
' comme prévu. Alors juste:<?php getenv('path') ?>
J'ai trouvé getenv()
utile pour éviter un bogue PHP étrange où parfois $_SERVER
et $_ENV
n'étaient pas définis Si auto_globals_jit
était activé (création des variables _SERVERet _ENV lors de leur première utilisation). Depuis lors, j'ai commencé à l'utiliser.
J'ajouterais que getenv () est un meilleur choix car, en tant que Fonction, il peut être surchargé à des fins de test. Alors que l'écrasement de vos variables $_SERVER ou $ _ENV pourrait interférer avec les frameworks de test et d'autres bibliothèques et nécessiter finalement beaucoup plus de travail à effectuer en toute sécurité.