現在、$_SERVER の代わりに $GLOBALS['_SERVER'] を使用して関連する環境変数にアクセスすると、常に「_SERVER 未定義」エラーが報告されます。次の使用例:
使用例 1:
Print_r($GLOBALS);
現時点では、出力には _SERVER 関連の情報はありません:
配列
(
[グローバル] => 配列
*回帰*
[_POST] => 配列
(
)
[_GET] => 配列
(
)
[_COOKIE] => 配列
(
)
[_FILES] => 配列
(
)
)
使用例 2:
Print_r($GLOBALS);
Print_r($_SERVER);
現時点では、出力には _SERVER 関連情報が含まれています:
配列
(
[グローバル] => 配列
*回帰*
[_POST] => 配列
(
)
[_GET] => 配列
(
)
[_COOKIE] => 配列
(
)
[_FILES] => 配列
(
)
[_SERVER] => 配列
(
)
)
PHPマニュアルで$GLOBALSの説明を確認し、gmail dot comのtherandshowのコメントを引用しました:
Gmail ドットコムでのザランドショー
PHP 5.4 以降、$GLOBALS はジャストインタイムで初期化されるようになりました。これは、使用しない利点があることを意味します
。
$GLOBALS 変数を使用すると、初期化のオーバーヘッドを回避できます。これはどれほどの利点がありますか?
よくわかりませんが、とにかく $GLOBALS があまり好きではありませんでした。
ソースを追跡すると、PHP5Changelog 更新ログの説明を見つけました:
順序なしリスト項目改良された Zend エンジン、パフォーマンスの調整と最適化
順序なしリストの $GLOBALS を JIT 自動グローバルに変更したため、使用された場合にのみ初期化されます (オペコード キャッシュに影響する可能性があります!) www.2cto.com
。
718 ; 有効にすると、SERVER 変数と ENV 変数が最初に作成されます
719 ; これらの変数
の開始時に代わりに使用されます。
720 ; はスクリプト内で使用されないため、このディレクティブをオンにすると
となります。
721 ; PHP ディレクティブ register_globals、 register_long_arrays、
722 ; このディレクティブが影響を与えるには register_argc_argv を無効にする必要があります。
723 ; http://php.net/auto-globals-jit
724 auto_globals_jit = オン
最終的に、PHP5+ で auto_globals_jit = On がオンになっている場合、$_SERVER 変数と $_ENV 変数はスクリプトの開始時に作成されず、$SERVER と $ENV が初めて使用されるときに作成されることがわかりました。 。したがって、上記の 2 つのユースケースが表示されます。
備考:
実測結果:
auto_globals_jit 設定は、5.3 の $_REQUEST スーパーグローバルにも影響します。ドキュメントには明示的に記載されていません。
少なくともバージョン 5.3.13 で auto_globals_jit = On がオンになっている場合、$_REQUEST は初めて使用されるときにのみ作成されます。
http://www.bkjia.com/PHPjc/735083.html