はじめに
PHP のセッションはデフォルトでファイルに保存されますが、試験問題では「セッションの保存先をカスタマイズする方法」が出題されることがあります。本記事では、session_set_save_handler()
の使い方と、stdClass
を渡した場合に発生するエラーについて整理します。
目次
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
を渡すとエラーになるのは正しい挙動。- 試験では **「型チェック」や「実装すべきメソッド」**を理解しているかがポイントです。