PHP5 では、$GLOBALS 遅延初期化の概念が導入されています
作者:zhanhailiang 日期:2013-01-18
今日のコードを整理するために、$_SERVER の代わりに $GLOBALS['_SERVER'] を使用して関連する環境変数にアクセスしたいと思いますが、常に「_SERVER「未定義」エラー。次の使用例:
使用例 1:
<span class="kw2" style="color:rgb(0,0,0); font-weight:bold"><?php</span> <span class="kw3" style="color:rgb(0,0,102)">print_r</span><span class="br0" style="color:rgb(102,204,102)">(</span><span class="re0" style="color:rgb(0,0,255)">$GLOBALS</span><span class="br0" style="color:rgb(102,204,102)">)</span><span class="sy0" style="color:rgb(102,204,102)">;</span>現時点では、出力には _SERVER 関連の情報はありません:
<span class="kw3" style="color:rgb(0,0,102)">Array</span> <span class="br0" style="color:rgb(102,204,102)">(</span> <span class="br0" style="color:rgb(102,204,102)">[</span>GLOBALS<span class="br0" style="color:rgb(102,204,102)">]</span> <span class="sy0" style="color:rgb(102,204,102)">=></span> <span class="kw3" style="color:rgb(0,0,102)">Array</span> <span class="sy0" style="color:rgb(102,204,102)">*</span>RECURSION<span class="sy0" style="color:rgb(102,204,102)">*</span> <span class="br0" style="color:rgb(102,204,102)">[</span>_POST<span class="br0" style="color:rgb(102,204,102)">]</span> <span class="sy0" style="color:rgb(102,204,102)">=></span> <span class="kw3" style="color:rgb(0,0,102)">Array</span> <span class="br0" style="color:rgb(102,204,102)">(</span> <span class="br0" style="color:rgb(102,204,102)">)</span> <span class="br0" style="color:rgb(102,204,102)">[</span>_GET<span class="br0" style="color:rgb(102,204,102)">]</span> <span class="sy0" style="color:rgb(102,204,102)">=></span> <span class="kw3" style="color:rgb(0,0,102)">Array</span> <span class="br0" style="color:rgb(102,204,102)">(</span> <span class="br0" style="color:rgb(102,204,102)">)</span> <span class="br0" style="color:rgb(102,204,102)">[</span>_COOKIE<span class="br0" style="color:rgb(102,204,102)">]</span> <span class="sy0" style="color:rgb(102,204,102)">=></span> <span class="kw3" style="color:rgb(0,0,102)">Array</span> <span class="br0" style="color:rgb(102,204,102)">(</span> <span class="br0" style="color:rgb(102,204,102)">)</span> <span class="br0" style="color:rgb(102,204,102)">[</span>_FILES<span class="br0" style="color:rgb(102,204,102)">]</span> <span class="sy0" style="color:rgb(102,204,102)">=></span> <span class="kw3" style="color:rgb(0,0,102)">Array</span> <span class="br0" style="color:rgb(102,204,102)">(</span> <span class="br0" style="color:rgb(102,204,102)">)</span> <span class="br0" style="color:rgb(102,204,102)">)</span>使用例 2:
<span class="kw2" style="color:rgb(0,0,0); font-weight:bold"><?php</span><span style="color:#333333"> </span><span class="kw3" style="color:rgb(0,0,102)">print_r</span><span class="br0" style="color:rgb(102,204,102)">(</span><span class="re0" style="color:rgb(0,0,255)">$GLOBALS</span><span class="br0" style="color:rgb(102,204,102)">)</span><span class="sy0" style="color:rgb(102,204,102)">;</span><span style="color:#333333"> </span><span style="color:#ff0000"><span class="kw3">print_r</span><span class="br0">(</span><span class="re0">$_SERVER</span><span class="br0">)</span><span class="sy0">;</span></span>現時点では、出力には _SERVER 関連情報が含まれています:
<span class="kw3" style="color:rgb(0,0,102)">Array</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">(</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">[</span><span style="color:#333333">GLOBALS</span><span class="br0" style="color:rgb(102,204,102)">]</span><span style="color:#333333"> </span><span class="sy0" style="color:rgb(102,204,102)">=></span><span style="color:#333333"> </span><span class="kw3" style="color:rgb(0,0,102)">Array</span><span style="color:#333333"> </span><span class="sy0" style="color:rgb(102,204,102)">*</span><span style="color:#333333">RECURSION</span><span class="sy0" style="color:rgb(102,204,102)">*</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">[</span><span style="color:#333333">_POST</span><span class="br0" style="color:rgb(102,204,102)">]</span><span style="color:#333333"> </span><span class="sy0" style="color:rgb(102,204,102)">=></span><span style="color:#333333"> </span><span class="kw3" style="color:rgb(0,0,102)">Array</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">(</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">)</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">[</span><span style="color:#333333">_GET</span><span class="br0" style="color:rgb(102,204,102)">]</span><span style="color:#333333"> </span><span class="sy0" style="color:rgb(102,204,102)">=></span><span style="color:#333333"> </span><span class="kw3" style="color:rgb(0,0,102)">Array</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">(</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">)</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">[</span><span style="color:#333333">_COOKIE</span><span class="br0" style="color:rgb(102,204,102)">]</span><span style="color:#333333"> </span><span class="sy0" style="color:rgb(102,204,102)">=></span><span style="color:#333333"> </span><span class="kw3" style="color:rgb(0,0,102)">Array</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">(</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">)</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">[</span><span style="color:#333333">_FILES</span><span class="br0" style="color:rgb(102,204,102)">]</span><span style="color:#333333"> </span><span class="sy0" style="color:rgb(102,204,102)">=></span><span style="color:#333333"> </span><span class="kw3" style="color:rgb(0,0,102)">Array</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">(</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">)</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">[</span><span style="color:#ff0000">_SERVER</span><span class="br0" style="color:rgb(102,204,102)">]</span><span style="color:#333333"> </span><span class="sy0" style="color:rgb(102,204,102)">=></span><span style="color:#333333"> </span><span class="kw3" style="color:rgb(0,0,102)">Array</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">(</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">)</span><span style="color:#333333"> </span><span class="br0" style="color:rgb(102,204,102)">)</span>$GLOBALS の記述について PHP マニュアルを確認し、therandshow を引用 at Gmail ドットコムからのコメント:
Gmail ドットコムでのショーPHP 5.4 以降、$GLOBALS はジャストインタイムで初期化されるようになりました。 これは、 を使用しない方が有利であることを意味します。
$GLOBALS 変数を使用すると、初期化のオーバーヘッドを回避できます。
よくわかりませんが、とにかく $GLOBALS があまり好きではありませんでした。 ソースを追跡したところ、PHP5Changelog 更新ログの記述を見つけました:
順序なしリスト項目Zend エンジンの改善、パフォーマンスの調整と最適化順序付けされていないリスト itemChanged $GLOBALS を JIT 自動グローバルに変更したため、使用された場合にのみ初期化されます (オペコード キャッシュに影響する可能性があります!)。<span style="color:#333333"> </span><span class="nu0" style="color:rgb(204,102,204)">718</span><span style="color:#333333"> </span><span class="co0" style="color:rgb(128,128,128); font-style:italic">; </span><span class="co0" style="font-style:italic"><span style="color:#ff0000">When enabled, the SERVER and ENV variables are created when they're first</span></span><span style="color:#333333"> </span><span class="nu0" style="color:rgb(204,102,204)">719</span><span style="color:#333333"> </span><span class="co0" style="color:rgb(128,128,128); font-style:italic">; </span><span class="co0" style="font-style:italic"><span style="color:#ff0000">used (Just In Time) instead of when the script starts.</span></span><span class="co0" style="color:rgb(128,128,128); font-style:italic"> If these variables</span><span style="color:#333333"> </span><span class="nu0" style="color:rgb(204,102,204)">720</span><span style="color:#333333"> </span><span class="co0" style="color:rgb(128,128,128); font-style:italic">; are not used within a script, having this directive on will result in a</span><span style="color:#333333"> </span><span class="nu0" style="color:rgb(204,102,204)">721</span><span style="color:#333333"> </span><span class="co0" style="color:rgb(128,128,128); font-style:italic">; performance gain. The PHP directives register_globals, register_long_arrays,</span><span style="color:#333333"> </span><span class="nu0" style="color:rgb(204,102,204)">722</span><span style="color:#333333"> </span><span class="co0" style="color:rgb(128,128,128); font-style:italic">; and register_argc_argv must be disabled for this directive to have any affect.</span><span style="color:#333333"> </span><span class="nu0" style="color:rgb(204,102,204)">723</span><span style="color:#333333"> </span><span class="co0" style="color:rgb(128,128,128); font-style:italic">; http://php.net/auto-globals-jit</span><span style="color:#333333"> </span><span class="nu0" style="color:rgb(204,102,204)">724</span><span style="color:#333333"> auto_globals_jit </span><span class="sy0" style="color:rgb(102,204,102)">=</span><span class="re2" style="color:rgb(0,0,255)"> On</span>やっとわかりました。PHP5+ では、auto_globals_jit = On がオンになっている場合、$_SERVER 変数と $_ENV 変数はスクリプトの開始時に作成されませんが、最初に使用されます $ SERVER と $ENV が作成されます。 上記の 2 つのユースケースが表示されます。
注:実測結果:
auto_globals_jit 設定は 5.3 の $_REQUEST スーパーグローバルにも影響します。これはドキュメントには明示的に記載されていません。
少なくともバージョン 5.3.13 では、auto_globals_jit = On がオンになっている場合、$_REQUEST は初めて使用されるときにのみ作成されます。