[PHP-users 4286] Re: PHP4.1.0 でセッション変数をunset した場合

Eita Morikawa php-users@php.gr.jp
Fri, 14 Dec 2001 14:41:23 +0900


森川です。

実験までしていただきありがとうございます。

> まず、array()は、
> 
> array_merge($a, array("key" => "value"));
> 
> とかしないとダメです。

おっしゃる通りですね。おおぼけでした。

> register_globalsをOffにした状態で文末のソースを試すと、
> 
> case1  空
> case2  key1
> case3  key3
> case4  key1,key3
> 
> となりました。

当方でも確認しました。

> というわけで、register_globalsがOnの時は、session_register('a')と
> すると、$_SESSION['a']=&$aを同時に行うということに置き換えられる
> ようです。
> そもそも、session_registerで宣言せずとも$_SESSIONをいきなり呼んで
> よいということが、$_SESSIONですべて登録されることを示唆している気
> もします。
> 
> なので、unsetしたあとに、再度$_SESSION['a'] = &$aとしてやれば、期
> 待される結果を得られます。(念のため試しました。

これも確認しました。確かにregister_globalsがOffの場合はよさそうなので
すが、register_globalsがOnの場合は、納得できないケースが出てきました。

> // case 2:
>  $a = array("key1" => "value1");
>  session_register("a");
>  $_SESSION['a'] = &$a;
>  unset($a);
>  $a = array_merge($a, array("key2" => "value2"));

実験していただいたcase2と、case2から $_SESSION['a'] = &$a; の一行を
削除したソース (case5とします)でregister_globalsをOnにして試したところ

case2 → key1
case5 → key2

となりました。ただし、スクリプトの先頭でsession_start()をしており、リロードすると
case5も key1となります。(リロードの前後でsession_idが同一であることは確認)

#尚、先の私が試した結果は、register_globalsはOn、スクリプトの先頭に
#session_start()があり、リロード後という、まさにこの状態でのものでした。

case2 については納得いくのですが、case5はどう考えたらよいのでしょう?
再引用しますが、

> というわけで、register_globalsがOnの時は、session_register('a')と
> すると、$_SESSION['a']=&$aを同時に行うということに置き換えられる
> ようです。

というのとも少し挙動が違うようにみえます。

#いろいろ試してみてるうちに混乱してきました。PHP4.0.6までだとこのようなケース
#は全てkey2となり、わたし的には直感的に分り易かったのですが、PHP4.1.0では
#この辺りをちゃんと理解しないと移行は難しいかなぁという気分になってきてます。
#もちろんregister_globalsをOffにしてコードを書き直せばよいのですが...