はじめに
PHPでは「エラーの検出」と「エラーの出力」をそれぞれ別に制御できます。
この仕組みを理解していないと、「あれ?警告が出ない」「ログにはあるのに画面では見えない」といった混乱が起こりがちです。
この記事では、error_reporting() と display_errors の違いを、実行例と図解を交えて整理します。
目次
🧠 そもそもエラーには「検出」と「出力」がある
PHPではエラーが発生したときに、
1️⃣ どのエラーを検出するか(=報告レベル)
2️⃣ 検出したエラーを画面に出すか(=出力設定)
を別々に決められます。
これをそれぞれ設定するのが以下の2つです。
| 設定項目 | 概要 | 設定例 |
|---|---|---|
| error_reporting() | どのレベルのエラーを検出するか | error_reporting(E_ALL) |
| display_errors | 検出したエラーを画面出力するか | '1':出力 / '0':非出力 / 'stderr':標準エラー出力 |
🧩 設定の流れを図で理解しよう!
┌──────────────────────────────┐
│ PHPエラー処理の流れ │
├──────────────────────────────┤
│ (1) エラー発生! │
│ ↓ │
│ (2) error_reporting の判定 │
│ ├─ OFF → 無視(処理終了) │
│ └─ ON → 検出(次へ) │
│ ↓ │
│ (3) display_errors の判定 │
│ ├─ '0' → 出力せずログなどに記録 │
│ ├─ '1' → ブラウザなどに出力 │
│ └─ 'stderr' → 標準エラー出力へ │
└──────────────────────────────┘
🧪 実験コード
<?php
declare(strict_types=1);
// すべてのエラーを検出する
error_reporting(-1);
//
// ① 画面出力OFF
ini_set('display_errors', '0');
echo "display_errors 0\n";
var_dump($arr[0]); // 未定義変数
//
// ② エラー報告OFF
error_reporting(0);
echo "error_reporting 0\n";
var_dump($arr[0]);
//
// ③ 画面出力ON & エラー報告ON
ini_set('display_errors', '1');
error_reporting(E_ALL);
echo "display_errors 1 & error_reporting E_ALL\n";
var_dump($arr[0]);🖥 実行結果
display_errors 0
NULL
error_reporting 0
NULL
display_errors 1 & error_reporting E_ALL
Warning: Undefined variable $arr in /var/www/html/part2/p89.php on line 17
Warning: Trying to access array offset on value of type null in ...
NULL🔍 各設定の動き
| 状況 | error_reporting | display_errors | 挙動 |
|---|---|---|---|
| ① | -1(全検出) | 0(非表示) | エラーを検出するが出力しない |
| ② | 0(検出しない) | 0(非表示) | そもそも検出しない |
| ③ | E_ALL(全検出) | 1(出力) | エラーを検出し画面に出力 |
💡 試験対策ポイント
error_reporting()…「どのレベルのエラーを検出するか」display_errors…「検出したエラーを画面に出すか」- 両方ONにしないと画面には出ない(開発時ON・本番時OFFが基本)
- CLI実行時は
'stderr'に出す設定も有効(ログ分離が便利)
まとめ
| 項目 | 意味 | 設定例 |
|---|---|---|
| error_reporting | 検出するエラーレベルを決定 | E_ALL, 0, -1 |
| display_errors | エラーを画面に出力するか | '1', '0', 'stderr' |
| 典型ミス | display_errors=1でもerror_reporting=0なら出ない | 🚫 |
| 正解パターン | 両方ONで警告が表示される | ✅ |
