[PHP-users 12516] Re: グローバル変数 $HTTP_ と $_ の違いについて

Yasuo Ohgaki php-users@php.gr.jp
Sat, 11 Jan 2003 11:28:10 +0900


大垣です

Seto wrote:
> Setoです。こんXXは。
> 
> スーパーグローバル変数について
> Onlineマニュアルには
> http://www.php.net/manual/ja/language.variables.predefined.php
> 
> (たとえばSESSION)
> $_SESSION
> スクリプトのセッションに現在登録されている変数。 以前の$HTTP_SESSION_
> VARS配列(まだ利用可能ですが、 推奨されません)と類似しています。

$HTTP_*_VARSと$_*には重要な注意点があります。
この2つは同じ変数ではなく、コピーになります。

実際にはPHP4は変数のリファレンスカウンティングを
サポートしているので、変更しない限りは余分なメモリ
を消費しませんが、変更すると別の変数になります。

したがって、$HTTP_*_VARSと$_*を混ぜて使用すると
おかしな事になります。

私は$HTTP_*_VARSはスクリプト中でunsetしています。
リファレンスカウント-1するだけなのでオーバーヘッド
は無視できます。

良く覚えていないですが、SESSION配列だけはリファレンス
になっていたかも知れません。(詳しくはソースを見てください

# リファレンスとリファレンスカウントは名前が似ています
# が別物です

PHP 4.2.0がリリースされる前に、コピーではなくリファレ
ンスにした方が良いのでは?とphp-devにポストしてみたの
ですが、反応がなかったのと、個人的には別になっている方が
都合が良い場合があったのでコピーになっています。

これは簡単なスクリプトで$HTTP_*_VARSと$_*がコピー
であることが検証できます。

[yohgaki@dev yohgaki]$ php-cgi
<?php

var_dump($_POST);
var_dump($HTTP_POST_VARS);

$_POST['test'] = 'ABC';

var_dump($_POST);
var_dump($HTTP_POST_VARS);
?>





Status: 200
Content-type: text/html

array(0) {
}
array(0) {
}
array(1) {
  ["test"]=>
  string(3) "ABC"
}
array(0) {
}


--
Yasuo Ohgaki