Quelle est la différence entre getenv()
y $_ENV
?
Y a-t-il des inconvénients à utiliser l'un ou l'autre ?
J'ai remarqué que parfois getenv()
me donne ce dont j'ai besoin, tandis que $_ENV
ne le fait pas (comme HOME
).
Quelle est la différence entre getenv()
y $_ENV
?
Y a-t-il des inconvénients à utiliser l'un ou l'autre ?
J'ai remarqué que parfois getenv()
me donne ce dont j'ai besoin, tandis que $_ENV
ne le fait pas (comme HOME
).
Selon la documentation php sur getenv ils sont exactement les mêmes, sauf que getenv
recherchera la variable sans tenir compte de la casse lorsqu'il fonctionne sur des systèmes de fichiers insensibles à la casse (comme Windows). Sur les hôtes Linux, elle fonctionne toujours en respectant la casse. La plupart du temps, cela n'a probablement pas d'importance, mais l'un des commentaires de la documentation l'explique :
Par exemple, sous Windows, $_SERVER['Path'] ressemble à ce que vous voyez, avec la première lettre en majuscule, et non pas 'PATH' comme vous pourriez vous y attendre.
Pour cette raison, je choisirais probablement d'utiliser getenv
pour améliorer le comportement multiplateforme, à moins que vous ne soyez certain de la casse de la variable d'environnement que vous essayez de récupérer.
Steve Clay Le commentaire de l'auteur de cette réponse souligne une autre différence :
Ajouté
getenv()
avantage : vous n'avez pas besoin de vérifierisset
/empty
avant l'accès.getenv()
n'émettra pas d'avis.
Je sais que le commentaire dans la documentation dit que getenv
est insensible à la casse, mais c'est pas le comportement que je constate :
> 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
Regarder le code source pour les getenv
c'est parce qu'il y a trois façons pour PHP de récupérer la variable d'environnement :
sapi_getenv
(par exemple, s'il obtient la variable d'environnement d'Apache)GetEnvironmentVariableA
.getenv
fournie par libc
.Pour autant que je sache, le seul cas où la sensibilité à la casse est respectée est celui de Windows, car c'est ainsi que se comporte l'API des variables d'environnement de Windows. Si vous êtes sous Linux, BSD, Mac, etc. getenv
est toujours sensible à la casse.
Comme mentionné par mario , $_ENV
n'est pas toujours peuplée en raison des différentes configurations des variables_order
Il est donc préférable d'éviter $_ENV
si vous ne contrôlez pas la configuration du serveur.
Donc, pour le code PHP le plus portable :
getenv
.En outre $_ENV
est généralement vide si variables_order
n'a pas E
répertoriée. Dans de nombreuses configurations, il est probable que seuls les $_SERVER
est alimenté, et $_ENV
est strictement réservé à l'utilisation de l'interface de programmation.
D'autre part getenv()
accède directement à l'environnement.
(En ce qui concerne l'ambiguïté de l'affaire, on pourrait plus simplement employer array_change_key_case()
.)
J'ai trouvé getenv()
utile pour éviter un étrange bug PHP où parfois $_SERVER
y $_ENV
était indéfini si auto_globals_jit
a été activé (en créant le _SERVER y _ENV lorsqu'elles sont utilisées pour la première fois). Depuis, j'ai commencé à l'utiliser.
J'ajouterais que getenv() est un meilleur choix car, en tant que fonction, elle peut être surchargée à des fins de test. Alors que le fait de surcharger vos variables $_SERVER ou $_ENV pourrait interférer avec les frameworks de test et d'autres bibliothèques et nécessiterait finalement beaucoup plus de travail pour être effectué en toute sécurité.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
Ne vous laissez pas piéger par PHP qui vous cache les détails sanglants.
$_ENV
y$_SERVER
sont alimentés par des données obtenues de diverses manières.getenv()
est un autre moyen d'accéder à des données auxquelles PHP ne vous permet pas d'accéder directement. Cela fonctionne même avecvariables_order = "G"
quand$_SERVER
y$_ENV
sont vides. Lisez l'excellente réponse de Conor McDermottroe .0 votes
En rapport : Pourquoi mon $_ENV est-il vide ?
5 votes
Pour ceux qui utilisent le framework Symfony, il existe un cas plus limité de ce qui précède. getenv() retournera toujours la valeur de la variable env telle qu'elle était au démarrage du serveur php, même si elle a été modifiée par la suite. Alors que $_ENV[] peut être changé en cours d'exécution en modifiant les fichiers .env. Mais bien sûr, cela concerne Symfony, et non PHP en général.