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
getenvfournie 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é.