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

Toshiyuki Kajii php-users@php.gr.jp
Fri, 14 Dec 2001 01:51:02 +0900


梶井です。

* Fri, 14 Dec 2001 00:51:35 +0900
* "Eita Morikawa" <chanoma@parknet.co.jp> wrote:

>セッション変数をunsetした場合の挙動が少なくともPHP4.0.6(及び4.0.5)と
>PHP4.1.0で違うのですが、PHP4.1.0での挙動がどうも納得いかないので
>質問させてください。

ここ最近、セッションの挙動についていろいろと試してみていました。
この4パターンを試されたのは、global_registerは当然Onであると思い
ますが、4.0.6でcase3と4について

$HTTP_SESSION_VARS['a'] = array("key3" => "value3");

とやってみると、セッションへの登録はできないですよね。
しかし、4.1.0では

$_SESSION['a'] = array("key3" => "value3");

で登録出来ます。
ソースを読んだわけではないので、これは私の想像なのですが、

session_register('a');

の時点で、

$_SESSION['a'] = &$a;

が行われているのではないでしょうか。
その為に、一端unset($a)としてしまうと、参照として$_SESSION['a']
は残っているので、次に$aを確保したときは別のものになっていると。

試したわけではないのですが、私の想像が正しければ、

 session_register(a);
 unset($a);

これを逆にすると、目的の結果になりませんか?

>          4.0.5    4.1.0
>case1  key2    空
>case2  key2    key1
>case3  (key2)  key3
>case4  (key2)  key3
>
>case3,case4は$_SESSIONも使ってみたので、PHP4.0.5
>での実行結果は意味がないかもしれませんが、PHP4.1.0での
>結果はどれも、自分のイメージとは違います。あるべき姿は
>
>case1  key2
>case2  key2
>case3  key2,key3
>case4  key2,key3
>
>のように思っていますが、考え違いしていますでしょうか?
>
>#尚、unset($a) を $a=array(); に書き換えると、PHP4.1.0でも
>#case1とcase2についてはkey2となりました。

unsetではなく、中身を空にするとこの結果になるというのも、そうだ
と思います。
とりあえず、推奨されないようですし、global_registerはOffにした
方が賢明かと...

#説明下手ですね。すいません...


*---------------------------------------------------*
    Toshiyuki Kajii    梶井 俊幸
    e-mail:            mikoto@camino.nissan.ne.jp
*---------------------------------------------------*