在開發 PHP 應用時,正確設定字元編碼與錯誤報告等級是基礎且關鍵的步驟。本文整理 header() 設定 UTF-8 的最佳實務,並詳細說明 error_reporting() 各等級常數與組合技巧。
<?php
// 必須在任何輸出之前呼叫
header('Content-Type: text/html; charset=utf-8');
?>
此行等同於 HTML 中的 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">,但 HTTP 標頭優先級更高,能確保瀏覽器正確解碼,避免中文亂碼。
ob_start() 或框架自動輸出,請確認標頭在輸出緩衝刷新前送出;若已有輸出會觸發 Cannot modify header information 警告。
error_reporting() 控制執行時期回報的錯誤類型。參數為位元遮罩,可用 | 或 OR 組合。
| 值 | 常數 | 說明 |
|---|---|---|
| 1 | E_ERROR | 致命執行錯誤,腳本終止 |
| 2 | E_WARNING | 執行時警告,腳本繼續 |
| 4 | E_PARSE | 編譯期解析錯誤 |
| 8 | E_NOTICE | 執行期提醒(潛在 Bug) |
| 16 | E_CORE_ERROR | PHP 啟動初始化致命錯誤 |
| 32 | E_CORE_WARNING | PHP 啟動初始化警告 |
| 64 | E_COMPILE_ERROR | 編譯期致命錯誤 |
| 128 | E_COMPILE_WARNING | 編譯期警告 |
| 256 | E_USER_ERROR | 使用者觸發的錯誤 trigger_error() |
| 512 | E_USER_WARNING | 使用者觸發的警告 |
| 1024 | E_USER_NOTICE | 使用者觸發的提醒 |
| 2048 | E_STRICT | 編碼標準建議(PHP 5.4+ 已納入 E_ALL) |
| 4096 | E_RECOVERABLE_ERROR | 可捕獲的致命錯誤(可用 set_error_handler() 捕獲) |
| 8191 | E_ALL | 所有錯誤與警告(PHP 5.4+ 含 E_STRICT) |
error_reporting(E_ALL);
ini_set('display_errors', '1'); // 直接顯示於頁面
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', '/var/log/php/error.log');
$oldLevel = error_reporting(0); // 呼叫第三方程式碼... error_reporting($oldLevel); // 還原
SET NAMES utf8mb4,HTML 標頭同步宣告。.env 或設定檔區分開發/測試/生產的 error_reporting 與 display_errors。set_error_handler() 統一格式化記錄,避免敏感資訊外洩。declare(strict_types=1); 搭配 E_ALL,盡早發現型別不符問題。正確設定字元編碼與錯誤報告,能大幅減少亂碼與難以重現的 Bug,是 PHP 專案上線前的必修課。