PHP 問題集・練習問題クイズ

収録問題 40問 / 10問ランダム出題

基本文法 型と配列 関数と例外 Composer Webセキュリティ
PHPの10問クイズに挑戦

ランダムに出題・即時フィードバック・間違えた問題の復習機能付き

クイズをはじめる →

PHPのおすすめ教材を見る →

収録テーマ一覧(全40問)

Q1

PHPで、リクエストごとに読み込む設定ファイルの中で、存在しないキーを参照したときの警告を避けつつ既定値を使いたい。最も自然な書き方はどれですか?

答え: $config['timezone'] ?? 'UTC'

null合体演算子 ?? は、左辺が存在しない、またはnullの場合に右辺を返します。配列キーが存在しない可能性がある設定値の既定値指定に向いています。

Q2

フォーム入力をHTMLへ表示するPHPテンプレートで、XSSを避けるために最も基本となる処理はどれですか?

答え: 出力時に htmlspecialchars でHTMLエスケープする

HTML文脈へユーザー入力を出すときは、出力時エスケープが基本です。htmlspecialchars はHTML特殊文字をエンティティへ変換します。

Q3

PHPファイルで関数の引数型を厳密に扱いたい。ファイル先頭に置く宣言として適切なのはどれですか?

答え: declare(strict_types=1);

declare(strict_types=1); は、そのファイルから呼び出す関数のスカラー型変換を厳格にします。既存コードとの境界では影響範囲を意識します。

Q4

PHPの名前空間つきクラス App\Service\Mailer を短い名前 Mailer で使いたい。適切なのはどれですか?

答え: use App\Service\Mailer;

use は名前空間つきクラスや関数などをインポートし、短い名前で参照するために使います。

Q5

APIレスポンスを連想配列として扱いたい。json_decode の呼び出しとして適切なのはどれですか?

答え: json_decode($json, true)

json_decode($json, true) はJSONオブジェクトを連想配列として返します。falseや省略時は標準オブジェクトとして扱われます。

Q6

PHPの配列で、ユーザーIDをキー、ユーザー名を値として保持したい。最も適切なデータ構造はどれですか?

答え: 連想配列

PHPの配列は順序付きマップとして使えます。IDをキーにして値を引く用途では連想配列が自然です。

Q7

関数が文字列またはnullを返す可能性を型宣言で表したい。PHP 8系で自然な戻り値型はどれですか?

答え: ?string

?stringstring|null と同じ意味のnullable型です。値を返さない void とは混ぜません。

Q8

大量データを1件ずつ処理し、全件をメモリに載せたくない。PHPで候補になる仕組みはどれですか?

答え: Generator と yield

Generatorは値を逐次生成できるため、大きな配列を作らずに反復処理したい場面で役立ちます。

Q9

PHP 8で、内部関数へ不正な型を渡したときに捕捉を考えるべき例外として適切なのはどれですか?

答え: TypeError

PHP 8では型に合わない引数で TypeError が投げられる場面があります。値の範囲が不正な場合は ValueError も考慮します。

Q10

例外が発生してもファイルハンドルを閉じるなどの後始末を必ず行いたい。使う構文として適切なのはどれですか?

答え: try / catch / finally

finally ブロックは例外の有無にかかわらず実行されるため、リソース解放などに向いています。

Q11

関数の引数にデフォルト値を設定する目的として適切なのはどれですか?

答え: 省略時の動作を明示し、呼び出し側の記述を簡潔にする

デフォルト引数は、よく使う既定動作を関数定義に表現するために使います。セキュリティや例外処理の代替ではありません。

Q12

コールバックを受け取る関数で、型宣言として意図が伝わりやすいものはどれですか?

答え: callable

callable は関数名、クロージャ、メソッド参照など、呼び出し可能な値を受け取る意図を示せます。

Q13

Composerで、プロジェクトが依存するパッケージとバージョン制約を記録する主なファイルはどれですか?

答え: composer.json

composer.json は依存パッケージ、autoload設定、スクリプトなどのプロジェクト定義を持ちます。

Q14

CIや本番デプロイで、composer.lock に固定されたバージョンをそのまま入れたい。適切なコマンドはどれですか?

答え: composer install

composer install はlockファイルがある場合、その内容に従って依存関係をインストールします。update は依存解決を更新します。

Q15

PSR-4 autoloadで App\ 名前空間を src/ に対応させたい。設定する場所はどれですか?

答え: composer.json の autoload

ComposerのPSR-4 autoloadは composer.jsonautoload セクションで定義し、必要に応じて composer dump-autoload で再生成します。

Q16

本番イメージに開発用ツールを入れたくない。Composer install時の代表的な指定はどれですか?

答え: composer install --no-dev

--no-devrequire-dev の依存をインストール対象から外します。本番ビルドのサイズや攻撃面を抑えるために使います。

Q17

ユーザー入力を使ってSQLを実行するPHPアプリで、SQLインジェクション対策として基本になるものはどれですか?

答え: PDOのプリペアドステートメントとバインド値を使う

SQLではプレースホルダとバインド値を使い、SQL構造とデータを分離するのが基本です。HTMLエスケープはHTML出力用です。

Q18

PHPでパスワードを保存する際に最も基本となるAPIの組み合わせはどれですか?

答え: password_hash / password_verify

password_hash は安全なパスワードハッシュを生成し、password_verify は入力パスワードとハッシュを検証します。

Q19

セッション固定攻撃への基本対策として、ログイン成功直後に行うべき処理はどれですか?

答え: session_regenerate_id(true) を実行する

ログインなど権限状態が変わるタイミングでセッションIDを再生成すると、固定されたIDの悪用リスクを下げられます。引数の true は古いセッションデータを削除する指定で、セキュリティ上推奨されます。

Q20

ファイルアップロード機能で、ユーザーが送った元ファイル名をそのまま保存名に使うリスクはどれですか?

答え: パストラバーサルや上書き、危険な拡張子の混入につながる可能性がある

アップロードでは保存名の生成、拡張子やMIMEの検証、保存先の分離、公開可否の制御などを考える必要があります。

Q21

PHPファイルでPHPコードとして解釈させるために基本的に使う開始タグはどれですか?

答え: <?php

PHPコードは通常 <?php で開始します。HTMLの中にPHPを埋め込む場合も、このタグ以降がPHPとして解釈されます。

Q22

PHPで変数名の先頭に付ける記号として正しいものはどれですか?

答え: $

PHPの変数は $name のように $ で始めます。変数名は大文字小文字を区別するため、$user$User は別の変数です。

Q23

PHPで複数の値をまとめて扱う基本的な型として適切なものはどれですか?

答え: array

array は複数の値をまとめて扱うための型です。数値添字の配列だけでなく、キーと値の組み合わせも扱えます。

Q24

PHPで条件によって処理を分けたい。最も基本的な構文はどれですか?

答え: if

if は条件式が真か偽かによって処理を分ける基本構文です。必要に応じて elseelseif と組み合わせます。

Q25

URLのクエリ文字列 ?page=2 で渡された値をPHPで受け取る基本的なスーパーグローバルはどれですか?

答え: $_GET

$_GET はURLクエリ文字列の値を受け取るスーパーグローバルです。受け取った値は信頼せず、用途に応じて検証やエスケープを行います。

Q26

年齢入力を整数として受け付け、範囲も確認したい。PHPで安全な入力処理の考え方として適切なのはどれですか?

答え: filter_varなどで型を検証し、その後に許容範囲を確認する

入力検証では、期待する型や形式を確認したうえで業務上の許容範囲も確認します。値を書き換えるサニタイズと、受け入れ可否を判断する検証は区別します。

Q27

パスワード再設定URLに使う推測困難なトークンをPHPで生成したい。適切な関数はどれですか?

答え: random_bytes

random_bytes は暗号学的に安全な乱数バイトを生成します。URLへ載せる場合はhexやBase64URLなど安全な表現へ変換し、有効期限と一回限りの利用も管理します。

Q28

受信したWebhook署名とサーバー側で計算した署名を比較する。タイミング攻撃の影響を抑えるために使う関数はどれですか?

答え: hash_equals

hash_equals は既知の署名と利用者由来の署名をタイミング情報が漏れにくい形で比較します。署名生成には共有鍵の管理や正しいHMAC検証も必要です。

Q29

外部利用者が送信したデータをPHPで復元する必要がある。オブジェクト注入のリスクを避ける基本方針はどれですか?

答え: 信頼できない値へunserializeを使わず、JSONなど必要な型だけを表現する形式を使う

信頼できないシリアライズ値のunserializeは、クラスのマジックメソッドなどを通じたオブジェクト注入につながる可能性があります。外部データにはJSONなど明示的なデータ形式を選びます。

Q30

本番PHP環境で例外のスタックトレースや内部パスを利用者へ見せず、障害調査は継続したい。適切な設定方針はどれですか?

答え: display_errorsを無効にし、log_errorsを有効にして保護されたログへ記録する

本番では詳細エラーを利用者へ表示せず、アクセス制御されたログへ記録します。利用者には一般化したエラー応答を返し、ログには秘密情報を残しすぎない配慮も必要です。

Q31

Composerで、本番環境へ開発用パッケージを含めずに依存関係をインストールしたい。適切なコマンドはどれですか?

答え: composer install --no-dev

composer install --no-devcomposer.lock に従って本番用依存関係だけをインストールします。本番では依存バージョンを固定して再現性を保つことが重要です。

Q32

PHPからDBへ利用者入力を含むSQLを実行する際、SQLインジェクション対策として最も適切なものはどれですか?

答え: PDOのプリペアドステートメントでプレースホルダに値をバインドする

SQLインジェクション対策では、SQL構文と値を分離するプリペアドステートメントが基本です。HTMLエスケープはHTML出力用であり、SQL文脈の対策ではありません。

Q33

PDOでDB処理に失敗したとき例外として扱いたい。接続時に設定する属性として適切なものはどれですか?

答え: PDO::ATTR_ERRMODE に PDO::ERRMODE_EXCEPTION を設定する

PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION にすると、DBエラーを例外として扱いやすくなり、失敗時の制御が明確になります。

Q34

ログイン成功後にセッション固定攻撃のリスクを下げるため、PHPで行うべき基本処理はどれですか?

答え: session_regenerate_id(true) でセッションIDを再生成する

ログインなど権限状態が変わるタイミングではセッションIDを再生成し、攻撃者が事前に固定したIDを使い続けるリスクを下げます。

Q35

PHPで画像アップロードを受け付ける際、基本的な安全策として適切なものはどれですか?

答え: MIME/拡張子だけに頼らず内容検査し、保存名を生成し、公開実行されない場所や設定で保存する

アップロードでは、サイズ制限、内容検査、保存名の生成、実行権限の排除、公開パス制御が重要です。利用者由来の名前や拡張子は信頼できません。

Q36

PHPの例外処理で、発生した例外を捕捉してログ記録や代替処理を行う基本構文はどれですか?

答え: try ... catch

try ... catch は例外が発生し得る処理を囲み、例外発生時にcatchブロックでログ記録、ロールバック、利用者向け応答などを行います。

Q37

PHPで関数の戻り値が存在しないことを型として明示したい。戻り値型として適切なものはどれですか?

答え: void

void は関数が値を返さないことを示す戻り値型です。null は値の一種であり、値を返さないこととは意味が異なります。

Q38

PHPでタイムゾーンを意識して日時を扱い、加算や比較を安全に行いたい。適切なクラスの組合せはどれですか?

答え: DateTimeImmutable と DateTimeZone

DateTimeImmutableDateTimeZone を使うと、タイムゾーンを明示しつつ日時を扱えます。Immutableな値は意図しない変更を避けやすい点も実務で有用です。

Q39

配列の各要素へ同じ変換を適用し、新しい配列を得たい。PHPで適切な関数はどれですか?

答え: array_map

array_map は各要素へコールバックを適用し、その結果から新しい配列を作ります。条件で絞る場合は array_filter、畳み込みには array_reduce を使います。

Q40

PHPでJSON APIのレスポンスを返す際、Content-Typeとして最も適切なものはどれですか?

答え: application/json

JSONを返すAPIでは Content-Type: application/json を設定し、クライアントがレスポンス形式を正しく解釈できるようにします。

certdrill.dev は、LPI Japan・IPA・AWS・Microsoft Azure その他各試験団体と一切関係のない独立した非公式学習サイトです。問題・解説はオリジナルコンテンツです。