web-dev-qa-db-ja.com

getenv()vs. $ _ENV in PHP

getenv()と_$_ENV_の違いは何ですか?

どちらを使用する場合でもトレードオフはありますか?

時々getenv()が必要なものを提供してくれますが、_$_ENV_はそうではありません(HOMEなど)。

72
tau

getenvに関するphpのドキュメント によると、getenvは大文字と小文字を区別しない方法で変数を検索することを除いて、まったく同じです。ほとんどの場合、それはおそらく重要ではありませんが、ドキュメントに関するコメントの1つで説明されています。

たとえば、Windowsの場合、$ _ SERVER ['Path']は最初の文字を大文字にしたものであり、予想される 'PATH'ではありません。

そのため、取得しようとしている変数のタイトルの大文字小文字がわからない限り、おそらくgetenvを使用することを選択するでしょう。

53
Batkins

私はドキュメントのコメントがgetenvは大文字と小文字を区別しないと言っていることを知っていますが、それはnot私が見ている動作です:

> 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環境変数を取得できる3つの方法があるためです。

  1. sapi_getenv経由(例:Apacheから環境変数を取得している場合)
  2. Windowsの場合、GetEnvironmentVariableAから。
  3. Windows以外の場合、getenvによって提供されるlibc関数から。

私の知る限り、大文字と小文字を区別しない方法で動作するのはWindowsのみです。これは、Windows環境変数APIの動作だからです。 Linux、BSD、Macなどを使用している場合、getenvは引き続き大文字と小文字が区別されます。

mario で述べたように、$_ENVの設定が異なるためにvariables_orderが常に入力されるとは限らないため、サーバーを制御しない場合は$_ENVを避けるのが最善です構成。

そのため、最も移植性の高いPHPコード:

  1. getenvを使用します。
  2. 環境変数名に正しい大文字と小文字を使用します。
42

さらに、 _$_ENV_ は、 _variables_order_Eがリストされていない場合、通常は空です。多くのセットアップでは、 _$_SERVER_ のみが入力され、_$_ENV_はCLIの使用のみに制限されます。

一方、 getenv() は環境に直接アクセスします。

(大文字と小文字のあいまいさについては、 array_change_key_case() を単純に使用できます。)

32
mario

PHP docs から取得:

この関数は、大文字と小文字を区別しない配列で$ varnameキーを検索するため、(_$_SERVER_、_$_ENV_と比較して)便利です。たとえば、Windowsの場合、_$_SERVER['Path']_は、期待どおりの 'PATH'ではなく、大文字で表示されるようです。ちょうど:<?php getenv('path') ?>

3
Ayman Safadi

関数としてテスト目的でオーバーロードできるため、getenv()の方が良い選択だと付け加えます。一方、$ _ SERVERまたは$ _ENV変数を上書きすると、テストフレームワークや他のライブラリに干渉し、最終的に安全に実行するためにより多くの作業が必要になる場合があります。

1
Joe Green