[PHP-users 6819] unset($_SESSION['...'])

Eita Morikawa php-users@php.gr.jp
Thu, 11 Apr 2002 13:09:54 +0900


森川と申します。

PHP4.1.2
register_globals = * Off *
Vine Linux 2.1.5

グローバル変数$sessが未定義の場合は、
unset($_SESSION['sess']);
とやるだけで、セッション変数は削除されますが、

グローバル変数$sessが定義済みの場合は、
unset($_SESSION['sess']);
unset($sess);
としないと、削除されないようですが、
これは仕様でしょうか?

#[PHP-users 5401]からのスレッドに同様の話が
#でていますが、結局はっきりしていないので
#投稿させていただきました。

テストしたスクリプトと実行結果を示します。

-- (script) : a.php ---------------------

session_start();

foreach($_SESSION as $key => $value) {
    print "$key => $value <BR>";
}

$_SESSION['sess1']++;
$_SESSION['sess2']++;

-- (script) : b.php --------------------

session_start();

$sess1 = (isset($sess1)) ? $sess1+10 : 10000;
print "set '$sess1' to \$sess1 <BR>";

foreach($_SESSION as $key => $value) {
    print "$key => $value <BR>";
}

unset($_SESSION['sess1']);
unset($_SESSION['sess2']);

-- (結果) : a.php --------------------

(セッション変数未定義なので表示なし)

-- (結果) : a.php -> b.php -----------

set '10000' to $sess1 

sess1 => 1 
sess2 => 1 

-- (結果) : a.php -> b.php -> a.php---------------------

sess1 => 10000   <- b.phpでunsetしたのに残っている!!

-- (結果) : a.php -> b.php -> a.php -> b.php -----------

set '10000' to $sess1 

sess1 => 10001 
sess2 => 1 

-- (疑問点) -----------------------------------------------

b.phpで$sess1を定義すると、
b.phpでunset($_SESSION['sess1'])したにもかかわらず、

a.phpで$_SESSION['sess1']が定義される。

しかも、a.phpの$_SESSION['sess1']は
10001(b.phpの$_SESSION['sess1'])ではなく、
10000(b.phpで定義した$sess1)となる。

----------------------------------------------------------

b.phpで、$_SESSION = array()としても同じ結果です。
どう理解したらいいんでしょう?