こんにちは!PR TIMES ソフトウェアエンジニアの河瀨翔吾(@shogogg)です。現在は主にバックエンドの開発を担当しています。好きなエナジードリンクは「モンスターウルトラ」です。
今回は先日行われた PHPerKaigi 2025 に出展した弊社スポンサーブースの企画である PHPer 向けクイズについて解説します。イベント全体のレポートはスポンサーブース運営責任者である田中湧大が別途記事にしているのでそちらをご覧ください。

クイズ企画について
弊社では PHPerKaigi 2024 以降にスポンサーブースを出展した複数の PHPer 向けカンファレンスで「PHP 8.x チャレンジ」というストップウォッチゲームを楽しんでもらっていたのですが、今回は「PHP エンジニアが喜んでくれる・楽しんでくれる企画を改めて考えよう」という話になり、PHPer 向けのクイズを用意することになりました。
PHP 8.x チャレンジについては昨年の記事で詳しく紹介しているので興味のある方はそちらも是非ご覧ください。

3日間の得点分布
今回のクイズには3日間で延べ233人の方に挑戦いただきました!そして気になる得点分布を公開します!



ふりかえり
今回のブースでは Metabase を使って問題ごとの正答率や平均点、全問正解者数をリアルタイムで表示する仕組みを用意しました。これはブースに来てくださった方からも「どうやってるんですか?」と興味を持っていただくことも何度かあり、やってみてよかったなぁ、と思っています。

その一方で、うまくいかなかったと感じているのが難易度調整です。
前夜祭の時点で「難易度が高すぎる」とフィードバックをいただき、調整したはずの DAY1 でも0〜1点の方が半数以上、という結果に……。さらに調整した DAY-2 ではそこそこの難易度になったものの、ブースにお越しくださった多くの PHPer の皆さんを楽しませるつもりが、悩ませる結果になってしまいました。
また、企画決定が遅くなってしまったためにアプリを作り込む時間が足りず、誤答した場合にどれが正解だったのかわからない UI となっていました。チャレンジしてくださった皆さんに「答えが知りたい……!」とモヤッとした気持ちを抱かせてしまった感が否めません。
クイズの解説
そこで今回は3日間で出題した問題とその正解、正答率を今回作問に関わった以下3名による解説・コメント付きでご紹介させていただきます。
- 河瀨(@shogogg)
- 田中(@Romira915)
- 筒井(@tsuttsun_wind)
今回は3日間で全17問を用意したため、かなりボリュームがありますが、是非最後までお付き合いください!
readonly class が導入されたのは?
A. PHP 8.1
B. PHP 8.2
C. PHP 8.3
D. PHP 8.4
正解は「B. PHP 8.2」でした(正答率 10.0%1)。

作問者(河瀨)コメント:
PHP 8.1 で readonly property が導入され、その後たったの1年で readonly class が導入されたときの喜びが忘れられず、クイズ候補の募集が始まって最初に作問した記憶があります。
みんなもっと readonly class の安心感を知り、そして愛して欲しいです。
PHP 8.3 以降、new DateTime(...) の引数に日時として解釈できない文字列を与えた場合に発生するようになった例外は?
A. DateMalformedArgumentException
B. DateMalformedFormatException
C. DateMalformedStringException
D. DateMalformedValueException
正解は「C. DateMalformedStringException」でした(正答率 16.1%)。
作問者(河瀨)コメント:
PHP 8.2 までは
InvalidArgumentExceptionだったんですが、PHP 8.3 で専用の例外クラスが用意されました。弊社では日時を扱う際に IDE からの警告で目にする機会が多いんですが、PHP 8.3 までバージョンアップできていない環境でも警告が表示されてしまうのはなんとかならないかな?と苦しめられていたことからの作問でした。
ただこの問題、Carbon や Chronos を使っている方、つまりフレームワークを使っているであろう大多数の方は目にしたことがなかったんじゃないか、と少し反省しています。
Nowdoc 記法の説明として誤っているものはどれ?
A. ヒアドキュメントと異なり、変数は展開されない。
B. ヒアドキュメントと異なり、終端 ID 行に設定されたインデントは他の全ての行からも取り除かれる。
C. ヒアドキュメント同様、各行の終端にある改行は維持される。
D. PHP 5.3 で導入された。
正解は「B. ヒアドキュメントと異なり、終端 ID 行に設定されたインデントは他の全ての行からも取り除かれる」でした(正答率 32.8%)。
作問者(河瀨)コメント:
ごめんなさい、引っかけ問題です。ヒアドキュメントも Nowdoc もインデントは取り除かれます。
意外にもヒアドキュメントや Nowdoc 記法を知らない人が多くいることを知り、便利な機能として覚えて欲しい、という意図が込められています。
次のうち、デフォルト状態の PHP 8.4 において定義されているクラスは?
A. \Ds\Collection
B. \ZipArchive
C. \FTP\Connection
D. \SplDoublyLinkedList
正解は「D. \SplDoublyLinkedList」でした(正答率 25.7%)。
作問者(河瀨)コメント:
正解以外の選択肢も実在するクラスで、いかにも PHP なら標準で含まれていそうなものを選んだのですが、最後の選択肢である
SplDoublyLinkedListを見た瞬間に「SPL ってことは標準じゃないか」と気付けるかどうかを問う問題でした。ただ、作問にあたって「正解は
\SplFileObjectでした!」じゃ味気ないかな、と思い SPL の中から一番馴染みがなさそうなものを選んだことは否定できません。結果として意地悪な問題になってしまいました。また「デフォルト状態」が何を指すのかも曖昧でした。この辺りの校正は次回以降もっとしっかりやっていきたいと思います。
PHPの参照に関する次の説明のうち、正しいものはどれですか?
A. 参照が代入された変数を unset() しても、元の変数の値は影響を受けない
B. 関数の引数で参照渡し(&)を明示しなくても、オブジェクトは自動的に参照渡しされる
C. 参照を用いると、変数の値のコピーが作成されるためメモリ使用量が増加する
D. 参照を解除するには、$var = null を代入する必要がある
正解は「A. 参照が代入された変数を unset() しても、元の変数の値は影響を受けない」でした(正答率 25.0%)。
作問者(田中)コメント:
参照渡しは適切に使えば便利なものですが、いくつか注意したい挙動があります。参照を解除する方法を理解しているかを問う問題でした。
みんな大好き PHP-CS-Fixer。何の略?
- A. PHP Code Style Fixer
- B. PHP Coding Style Fixer
- C. PHP Coding Standards Fixer
- D. PHP Coding Smart Fixer
正解は「C. PHP Coding Standards Fixer」でした(正答率 24.0%)。
作問者(河瀨)コメント:
これは自分が「PHP Coding Style Fixer」だとずっと勘違いしていたことから「他の人もきっとそうなんじゃないか」「お世話になってるツールの正式名称や由来ぐらい覚えておくべきじゃないか」といった思いで作問しました。
次のDateTimeの操作を行うとどのような結果が返ってくる?
(new DateTime('2025-01-30'))->modify('+1 month')->format('Y-m-d');A. 2025-02-27
B. 2025-02-28
C. 2024-03-01
D. 2025-03-02
正解は「D. 2025-03-02」でした(正答率 35.0%)。
作問者(田中)コメント:
DateTimeクラスで日付を操作するときの注意点を問題にしました。2月には30日が存在しないため、余分な2日が3月に繰り越され「2025-03-02」となります。
DateTimeを使ったことがある方であれば一度は遭遇する問題だと思います。
次のうち、unlink 関数が失敗するのはどの場合?
A. 対象がディレクトリである場合
B. 対象がシンボリックリンクである場合
C. 対象のファイルに書込権限がない場合
D. 対象のファイルに実行権限がない場合
正解は「A. 対象がディレクトリである場合」でした(正答率 28.4%)。
作問者(河瀨)コメント:
フレームワークを利用した開発をしていると、ときどき標準関数の挙動を忘れてしまいます。ただファイルシステム関連の関数やコマンドは割と「ファイル向け」「ディレクトリ向け」に分かれていることが多いです。その辺りのツボを押さえているかどうかを問う作問でした。
ただ、他の選択肢をそれっぽくしすぎて想定以上に迷わせてしまったようで、思ったよりも正答率が低くなってしまいました。
echo 文の説明として誤っているものはどれ?
A. 関数ではなく文である
B. カンマ区切りで複数の値を指定して出力できる
C. 標準出力だけでなく標準エラーに出力することもできる
D. 文字列だけでなくバイナリを出力することもできる
正解は「C. 標準出力だけでなく標準エラーに出力することもできる」でした(正答率 29.0%)。
作問者(河瀨)コメント:
echo が文であることや、バイナリを出力できることは割とみなさんご存知だと思うんですが、カンマ区切りで複数の値を出力できるなんて普段のコーディングじゃ滅多に使わないし、知らない方も多いんじゃないかな?と思い、echo 文への興味を持って欲しくて作問しました。
次のうち、PHP の標準関数として実際に存在するのはどれ?
A. 指定された地点の日の出の時刻を返す関数
B. 指定された2点間の距離を返す関数
C. 指定された麻雀の手牌から点数を計算して返す関数
D. 指定された音声ファイルの長さ(秒数)を返す関数
正解は「A. 指定された地点の日の出の時刻を返す関数」でした(正答率 40.4%)。
作問者(河瀨)コメント:
自分が初めて
date_sunrise関数を知ったときの衝撃、同関数が PHP 8.1 アップデートで非推奨となったときの「まだ生きてたんだ」という思い、そして引き続きdate_sun_info関数を使えば日の出/日の入りの時刻がわかってしまう PHP の「標準関数で何でもできちゃう」感を感じて欲しくて作問しました。挑戦中の方から「麻雀の問題が……」と呼ばれていたのが印象に残っています。不正解用の選択肢を考えるのと「本当に存在しないよな……?」の確認(ファクトチェック)に時間が掛かった問題です。
次のうち、今のところ php コマンドに存在しないコマンドラインオプションはどれ?
A. --interactive:PHP インタラクティブシェルを起動する
B. --ini:読み込まれている ini ファイルの一覧を出力する
C. --silent:エラーを標準出力/標準エラーに出力しないようにする
D. --syntax-highlight:指定されたPHPファイルをシンタックスハイライトして表示するための HTML コードを出力する
正解は「C. --silent:エラーを標準出力/標準エラーに出力しないようにする」でした(正答率 22.9%)。
作問者(河瀨)コメント:
誤答選択肢=実際に存在するオプションは、作問者が初めてそれに気付いたときに驚いたものを採用しています。特に
--syntax-highlightは PHP ならではの機能だと思っていて、便利に使えた記憶はないんですが PHP のパワーを感じられるので、是非一度試してみてください。
「++$i」と「$i++」の違いの説明として正しいものはどれ?
A. ++$i は加算前、$i++ は加算後の値を返す
B. ++$i は加算後、$i++ は加算前の値を返す
C. ++$i は $i が null でも動作するが $i++ は null だとエラーになる
D. ++$i は $i が null だとエラーになるが $i++ はエラーにならない
正解は「B. ++$i は加算後、$i++ は加算前の値を返す」でした(正答率 29.0%)。
作問者(河瀨)コメント:
これは割と PHP 以外の言語でも共通する、前置インクリメントと後置インクリメントの挙動を答える問題で、準備段階でここまでの作問が「難しすぎる」とのフィードバックを得て用意した問題のつもり……だったんですが、思ったより苦戦している方が多く、いざクイズとして出されると難しかったのかもしれません。
型宣言時に新しくUnion型を指定できるようになったPHPバージョンは?
A. 7.0
B. 7.4
C. 8.0
D. 8.4
正解は「C. 8.0」でした(正答率 58.0%)。

作問者(筒井)コメント:
型宣言時や、戻り値に複数の型を指定できるようになった最初のバージョンなので出題しました。
7.4までは、PHPStanのアノテーションや、配列を利用するなどの工夫をする必要があったため、追加されて使い始めた人が多いのではと思います。
isset($text); で false になるものは?
A. $text = 0;
B. $text = "";
C. $text = [];
D. $text = null;
正解は「D. $text = null;」でした(正答率 73.9%2)。
作問者(筒井)コメント:
こちらはPHP初学者向けに出題しました。
issetは、変数がnullまたは未定義(初期化されていない)である場合はfalseを返します。この2つ以外、すなわち文字列や配列などが格納されている場合は全てtrueを返します。PHPを学び始めた人は、最初の方に詰まる問題だと思います。
DateTimeInterface::ISO8601 が非推奨となった理由は?
A. ISO 8601 の定義が変わったため
B. ISO 8601 に複数の仕様があり細分化するため
C. ISO 8601 という名前を使えなくなったため
D. PHP の実装(定義)が間違っていたため
正解は「D. PHP の実装(定義)が間違っていたため」でした(正答率 41.7%)。
作問者(河瀨)コメント:
Carbon などを使っていても ISO8601 形式にする際に「ATOM を使え」と IDE に警告されたり、コードレビューでコメントされた経験を持つ方は多いんじゃないでしょうか。そのときにきちんと理由まで把握しているかどうかを問う問題でした。
また「定義が間違っていた」というのもなかなかインパクトのある理由なので是非みんなに知ってもらいたかった、というのもあります。ご存知でしたか?
PHP 8.4でのOpenSSLの変更に関する次の説明のうち、正しいものはどれ?
A. openssl_pkey_new() が失敗したとき、false ではなく例外をスローする
B. ed25519のサポートが追加された
C. RSAの利用が非推奨になった
D. パスワードのハッシュ方法として PASSWORD_ARGON2 が実装された
正解は「B. ed25519のサポートが追加された」でした(正答率 14.3%)。
作問者(田中)コメント:
こちらはPHP8.4のリリース情報からの出題でした。
ed25519 は SSH のキーペアとして高いセキュリティとパフォーマンスを備えた暗号化方式として有名ですが、PHP8.4 より ed25519 をはじめとしたいくつかのフィールドがサポートされるようになりました。
1 + 1 . 1 の結果は次のうちどれ?
A. 21
B. '21'
C. 12
D. '12'
正解は「B. '21'」でした(正答率 53.7%)。
作問者(河瀨)コメント:
演算子の優先順位がどうなっているかを深掘りする……と思いきや、素直に左から順番に処理すればよかった、という深読みすると逆にわからなくなる問題です。ただ、他の問題の難易度が高かったこともあり、深読みする方が多かった印象です。
実は、前夜祭〜DAY-1 で「問題が難しすぎる」と多くの方からフィードバックがをいただいたため、DAY-2 の朝に慌てて作った問題でした。 フォントの関係で
1 . 1なのか1.1なのかがわかりにくかったのは反省ポイントです。
まとめ
今回初のチャレンジとなったクイズ企画は次回以降に活かしたい学びがたくさんありました。この経験を次回以降のブース運営に活かし、もっと PHPer の皆さんに楽しんでもらえる企画を考えていきたいと思っています。
改めて、弊社スポンサーブースにお立ち寄りくださった皆さん、ありがとうございました!!


