PHP 中 @ 運算子可抑制單一運算式的錯誤訊息(Notice、Warning),但濫用會隱藏真實問題,增加除錯難度。本文說明正確用法與替代方案。
$file = @file_get_contents('may_not_exist.txt'); // 抑制檔案不存在的 Warning
$value = @$array['missing_key']; // 抑制 Undefined array key Notice
error_get_last() 捕捉被抑制的錯誤。$content = @file_get_contents($cacheFile);
if ($content === false) {
$error = error_get_last();
// 記錄日誌、嘗試備用方案
$content = generateContent();
}
@ 無法抑制 Fatal Error、Parse Error,但會掩蓋前兆 Warning,導致問題爆發時難以追蹤。set_error_handler(),@ 會導致處理器不被呼叫,破壞統一錯誤處理機制。$value = $array['key'] ?? 'default'; // 替代 @$array['key']
if (isset($array['key'])) { $value = $array['key']; }
try {
$content = file_get_contents($file);
} catch (Throwable $e) {
// 統一處理
}
// 開發環境
error_reporting(E_ALL);
ini_set('display_errors', '1');
// 生產環境
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', '/var/log/php/error.log');
@ 屬於「應急工具」,非「標準作法」。現代 PHP 開發應善用 ??、isset()、例外處理、錯誤日誌,建立可觀測、可維護的錯誤處理體系。