getenv()
と_$_ENV
_の違いは何ですか?
どちらを使用する場合でもトレードオフはありますか?
時々getenv()
が必要なものを提供してくれますが、_$_ENV
_はそうではありません(HOME
など)。
getenvに関するphpのドキュメント によると、getenv
は大文字と小文字を区別しない方法で変数を検索することを除いて、まったく同じです。ほとんどの場合、それはおそらく重要ではありませんが、ドキュメントに関するコメントの1つで説明されています。
たとえば、Windowsの場合、$ _ SERVER ['Path']は最初の文字を大文字にしたものであり、予想される 'PATH'ではありません。
そのため、取得しようとしている変数のタイトルの大文字小文字がわからない限り、おそらくgetenv
を使用することを選択するでしょう。
私はドキュメントのコメントが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つの方法があるためです。
sapi_getenv
経由(例:Apacheから環境変数を取得している場合)GetEnvironmentVariableA
から。getenv
によって提供されるlibc
関数から。私の知る限り、大文字と小文字を区別しない方法で動作するのはWindowsのみです。これは、Windows環境変数APIの動作だからです。 Linux、BSD、Macなどを使用している場合、getenv
は引き続き大文字と小文字が区別されます。
mario で述べたように、$_ENV
の設定が異なるためにvariables_order
が常に入力されるとは限らないため、サーバーを制御しない場合は$_ENV
を避けるのが最善です構成。
そのため、最も移植性の高いPHPコード:
getenv
を使用します。さらに、 _$_ENV
_ は、 _variables_order
_ にE
がリストされていない場合、通常は空です。多くのセットアップでは、 _$_SERVER
_ のみが入力され、_$_ENV
_はCLIの使用のみに制限されます。
一方、 getenv()
は環境に直接アクセスします。
(大文字と小文字のあいまいさについては、 array_change_key_case()
を単純に使用できます。)
PHP docs から取得:
この関数は、大文字と小文字を区別しない配列で$ varnameキーを検索するため、(_
$_SERVER
_、_$_ENV
_と比較して)便利です。たとえば、Windowsの場合、_$_SERVER['Path']
_は、期待どおりの 'PATH
'ではなく、大文字で表示されるようです。ちょうど:<?php getenv('path') ?>
関数としてテスト目的でオーバーロードできるため、getenv()の方が良い選択だと付け加えます。一方、$ _ SERVERまたは$ _ENV変数を上書きすると、テストフレームワークや他のライブラリに干渉し、最終的に安全に実行するためにより多くの作業が必要になる場合があります。