[PHP-users 28286] Re: セッション情報の更新条件

HOTTA Michihide hotta @ net-newbie.com
2006年 2月 1日 (水) 15:04:12 JST


堀田@長崎市です。

On Mon, 30 Jan 2006 13:21:59 +0900, HOTTA Michihide <hotta @ net-newbie.com> wrote:
Subject: [PHP-users 28274] セッション情報の更新条件

> 堀田@長崎市%セッション変数初心者(?)です。
> 
> $_SESSION をセッション情報(デフォルトはファイル)へ書き戻す際の
> 条件について教えてください。
(snip)
> このように、$_SESSION への変更が反映されていません。
> 
> ちなみに 
> $_SESSION = array(...)
> のように、代入時に変数を介さなければうまくいくようです。
> これはバグ?それとも仕様?
> 
> リファレンスとかそのへんのからみかなぁとは思うんですが、どなたか
> この理由をわかりやすく説明していただけないでしょうか?

少し再現条件がわかってきました。こういうスクリプトでも再現します。

# PHP-5.1.2 です。

$remain = array('idx1', 'idx2', 'idx3');    //  残したいもの
foreach ($_SESSION as $key => $value) {
    if (!in_array($key, $remain)) {
        unset($_SESSION[$key]);             //  remain以外を未定義に
    }
}
print_r($_SESSION);

以下のようにすれば、セッションファイルにも書き戻されます。

foreach ($_SESSION as $key => $value) {
    if (!in_array($key, $remain)) {
        $del[] = $key;                      //  削除対象のキーを登録
    }
}
foreach ($del as $key)  {
    unset($_SESSION[$key]);
}
print_r($_SESSION);

いずれも、foreach の後の(スクリプト実行中の)$_SESSION は正しく
セットされているように見えるので、元々読み込んだ $_SESSION を指
しているポインタが書き変わってしまうような感じでしょうか?
-- 
HOTTA Michihide <hotta @ net-newbie.com>


PHP-users メーリングリストの案内