《PHP8上級試験対策》セッションハンドラの仕組みとsession_set_save_handler の正しい使い方

  • URLをコピーしました!

はじめに

PHP のセッションはデフォルトでファイルに保存されますが、試験問題では「セッションの保存先をカスタマイズする方法」が出題されることがあります。本記事では、session_set_save_handler() の使い方と、stdClass を渡した場合に発生するエラーについて整理します。

キーワード:session_set_save_handler / SessionHandlerInterface / カスタムセッションハンドラ / PHP8技術者認定試験上級

目次

session_set_save_handler の2種類の使い方

関数を個別に渡す方法

session_set_save_handler(
    callable $open,
    callable $close,
    callable $read,
    callable $write,
    callable $destroy,
    callable $gc,
    callable $create_sid = ?,
    callable $validate_sid = ?,
    callable $update_timestamp = ?
);

オブジェクトを渡す方法

session_set_save_handler(object $sessionhandler, bool $register_shutdown = true);

この場合、$sessionhandler は以下を実装している必要があります。

  • SessionHandlerInterface
  • (任意で)SessionIdInterface
  • (任意で)SessionUpdateTimestampHandlerInterface

サンプルコード

問題集のコード

<?php
declare(strict_types=1); 
error_reporting(-1);

$sessionhandler = new stdClass();
$r = session_set_save_handler($sessionhandler, true);

実行結果

Fatal error: Uncaught TypeError: session_set_save_handler():
Argument #1 ($open) must be of type SessionHandlerInterface,
stdClass given in /var/www/html/xxxxxxx.php:6

なぜこのエラーが起きるのか?

stdClass はただの空クラスであり、セッションの読み書きを行うメソッドを持っていません。
PHP は SessionHandlerInterface を実装したオブジェクトを期待しているため、型エラー(TypeError)となります。

この結果は 正しい挙動 です。

正しい使い方

デフォルトのハンドラを使う

$sessionhandler = new SessionHandler();
session_set_save_handler($sessionhandler, true);
session_start();

自作ハンドラを使う

class MySessionHandler implements SessionHandlerInterface {
    public function open($savePath, $sessionName): bool { return true; }
    public function close(): bool { return true; }
    public function read($id): string { return ''; }
    public function write($id, $data): bool { return true; }
    public function destroy($id): bool { return true; }
    public function gc($max_lifetime): int|false { return 0; }
}

$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();

試験対策ポイント

  • session_set_save_handler()セッション開始前に呼ぶ必要がある。
  • オブジェクトを渡す場合は必ず SessionHandlerInterface を実装していること
  • read() は「存在しない場合は空文字 '' を返す」。
  • register_shutdown = true にしておけば、終了時に自動で session_write_close() が呼ばれる。

まとめ

  • session_set_save_handler には コールバック方式オブジェクト方式がある。
  • オブジェクト方式では SessionHandlerInterface 実装が必須
  • stdClass を渡すとエラーになるのは正しい挙動。
  • 試験では **「型チェック」や「実装すべきメソッド」**を理解しているかがポイントです。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次