
PHP8 上級/準上級試験の認定模擬問題として、プライム・ストラテジー様のPRIME STUDYが認定されているようです。ただ、この模擬問題には解説がありませんので解説をまとめていこうと思います。シリーズ第20回目です。

PHP初級レベルから脱却して中級/上級レベルにいきたい人にピッタリの内容ですね。
PRIME STUDY認定模擬問題のリンクはこちらです → https://study.prime-strategy.co.jp/
問題文
セッション に関する説明の中で、誤っているものを1つ選びなさい。
また、すべてのコードには下記のコードが適切な箇所に書かれているものとする。
declare(strict_types=1);
error_reporting(-1);
下記はマニュアルから一部引用した内容である。
session_save_path ( string|null $path = null ) : string|false
session_save_path() は、 現在のセッションデータ保存パスを返します。
session_set_cookie_params ( int $lifetime_or_options , string|null $path = null , string|null $domain = null , bool|null $secure = null , bool|null $httponly = null ) : bool
session_set_cookie_params ( array $lifetime_or_options ) : bool
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 = ? ) : bool
session_set_save_handler ( object $sessionhandler , bool $register_shutdown = true ) : bool
(1)
PHP は「複数回のアクセスを通じて特定のデータを保持する手段」としてのセッションサポート機能を持っている。
セッションサポート機能により、スーパーグローバル配列 $_SESSION を使ってリクエスト間でデータを格納できるようになる。
そのため、以下のコード
session_start();
$_SESSION['key'] = 'value';
をブラウザ経由で実行した後に以下のコード
session_start();
var_dump($_SESSION['key']);
をブラウザ経由で実行すると、結果は次のとおりとなる。
string(5) "value"
(2)
PHP のセッションサポート機能において、セッションデータはデフォルトではファイルに保存される。
また、保存先のファイルは session_save_path() 関数によって取得または設定する事ができる。
そのため、以下のコード
ob_start();
var_dump( session_save_path() );
session_save_path('/tmp');
var_dump( session_save_path() );
を実行すると、結果は次のとおりとなる。
string(0) ""
string(4) "/tmp"
(3)
PHP のセッションサポート機能において、セッション ID というセッション ID と呼ばれるユニークな ID が割り当てられ、それは基本的にユーザー側にクッキーとして保存される。
そのためクッキーを使うので、セッション ID を保存するクッキーに対するパラメータを設定する事ができる関数が存在する。
そのため、以下のコード
ob_start();
var_dump( session_get_cookie_params() );
session_set_cookie_params(['lifetime' => 86400, 'samesite' => 'Strict', 'secure' => true, 'httponly' => true]);
var_dump( session_get_cookie_params() );
を実行すると、結果は次のとおりとなる。
array(6) {
["lifetime"]=>
int(0)
["path"]=>
string(1) "/"
["domain"]=>
string(0) ""
["secure"]=>
bool(false)
["httponly"]=>
bool(false)
["samesite"]=>
string(0) ""
}
Warning: session_set_cookie_params(): Unrecognized key 'samesite' found in the options array in …
array(6) {
["lifetime"]=>
int(86400)
["path"]=>
string(1) "/"
["domain"]=>
string(0) ""
["secure"]=>
bool(true)
["httponly"]=>
bool(true)
["samesite"]=>
string(0) ""
}
(4)
PHP のセッションサポート機能において、セッションデータはデフォルトではファイルに保存される。
しかし「ファイル以外 (DB 等)」に保存をする事も出来る。そのためにsession_set_save_handler() という関数がある。
最近は後者の方法で実装される事が多いが、その場合、SessionHandlerInterface、 SessionIdInterface (オプション) または SessionUpdateTimestampHandlerInterface を実装したクラス を継承したクラスのオブジェクトを引数として指定する必要がある。
そのため、以下のコード
class Hoge {
}
ob_start();
session_set_save_handler(new Hoge);
を実行すると、結果は次のとおりとなる。
Fatal error: Uncaught TypeError: session_set_save_handler(): Argument #1 ($open) must be of type SessionHandlerInterface, Hoge given in …
解説
選択肢1の解説
正しいです。
$_SESSION 配列を使って、リクエスト間でデータを格納できます。session_start() を呼び出すことでセッションが開始され、データを保存できます。
選択肢2の解説
正しいです。
デフォルトでは、セッションデータはファイルに保存され、session_save_path() 関数でその保存場所を取得・設定できます。最初は空の文字列が返り、設定後には指定したパスが返ります。
選択肢3の解説
誤りです。
samesite オプションはPHPの古いバージョンではサポートされておらず、そのため警告が発生する可能性があるため、この説明は正しくありません。
選択肢4の解説
正しいです。
session_set_save_handler() を使って、デフォルトのファイル保存以外に、例えばデータベースにセッションデータを保存することもできます。しかし、SessionHandlerInterface を実装したクラスのオブジェクトを引数として指定する必要があります。そのため、Hoge クラスのように適切なインターフェースを実装していないクラスを指定すると、TypeError が発生します。
正解選択肢
以上より選択肢3が正解となります。
コメント