@ 是 PHP 的錯誤控制運算符,將單一表達式的錯誤報告層級暫時設為 0。常見於舊代碼中抑制 Notice/Warning,但現代開發有更優雅的替代方案。
// 1. 陣列鍵可能不存在(舊式寫法)
$page = @$_GET['page'] ?? 1;
// 2. 檔案操作可能失敗
$content = @file_get_contents('config.json');
// 3. 資料庫連線(不推薦,應用異常處理)
$conn = @mysqli_connect('localhost', 'user', 'pass', 'db');
error_reporting,高頻路徑明顯拖慢。| 舊式 @ 寫法 | 現代寫法 (PHP 7/8) | 優勢 |
|---|---|---|
@$arr['key'] | $arr['key'] ?? 'default' | 語義明確、零效能損耗、可鏈式 |
@$obj->prop | $obj?->prop ?? 'default' | Null 安全、鏈式呼叫 |
@file_get_contents() | try { file_get_contents() } catch (Throwable $e) { ... } | 精準捕獲、可區分異常類型 |
@mysqli_connect() | new PDO(..., [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]) | 統一異常模式、預處理防注入 |
@json_decode() | json_validate() (PHP 8.3+) 或 json_last_error() | 標準化錯誤檢測 |
deprecated 警告,暫時無法升級時:@include_once 'legacy.php';@extension_loaded('foo')(極少見)。// 開發環境啟用
set_error_handler(function ($severity, $message, $file, $line) {
if (error_reporting() === 0) {
// 記錄被 @ 抑制的錯誤
error_log("[@SUPPRESSED][$severity] $message in $file:$line");
return true; // 不顯示
}
return false; // 交給預設處理器
});