ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

PHP:セッション変数を初期化したはずなのに初期化されない現象

PHPで、セッション変数の初期化を行いました。
セッションの破棄まではしたくなかったので、

$_SESSION = array();

としました。

セッション変数の初期化は、PHPのマニュアルにサンプルとして書いてある方法です。
セッション変数が連想配列になっているからできる方法です。
php.net
この方法で、予想通りの動作をしました。

f:id:AJYA:20190226125725p:plain
unsplash-logoÉmile Perron

unset()では初期化できない?

セッション変数が連想配列なので、空の配列で初期化するというのもいいのですが、変数の削除ならunset()もあります。
php.net

unset()でも初期化できると考えてコードを以下のようにしてみました。

unset($_SESSION);

結果は、unset()を呼び出した直後にvar_dump()で確認するとNULLになっていました。
セッション変数に値を入れると、以前の値が復活していました。

何度試しても同じなので、最初に書いた方法を採用しました。

セッション変数を部分的に割り当てを解除する、

unset($_SESSION['quux']);

は想定どおり値が消えていました。

部分的な割り当て解除できるなら、全ても大丈夫だと思っていましたが、結果は違いました。
思い込みで誤った動作のまま作りこんで、後から修正に時間を費やさないで済むように気をつけます。

sension_unset()の使用経験はありませんが、警告に

$_SESSION スーパーグローバルを使用した セッション変数の登録が不可能になってしまうため、 unset($_SESSION) を使って $_SESSION を完全に unset しないでください。

とあるので、正しくない方法とされているようです。
php.net