はじめに
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で警告が表示される | ✅ |