|| 預設值寫法// JS 寫法
function setSomething(a){ a = a || 'default'; }
// PHP || 永遠返回 bool,無法直接賦值
??(Null Coalescing Operator)$username = $_GET['user'] ?? 'nobody'; // 等價於 $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
$x = $_GET['a'] ?? $_POST['a'] ?? 'default';Undefined index Notice?:(Elvis Operator / 短三元)$username = @$_GET['user'] ?: 'nobody'; // 等價於 $username = $_GET['user'] ? $_GET['user'] : 'nobody';
關鍵差異:
| 運算子 | 判斷條件 | Notice 風險 | 適用版本 |
|---|---|---|---|
?? | isset()(非 null 且存在) | 無 | PHP 7.0+ |
?: | boolval()(真值) | 若變數未定義需 @ 抑制 | PHP 5.3+ |
$_GET['user'] = ''; // ?? 視為「已設定但為空字串」 → 返回 '' // ?: 視為「假值」 → 返回 'nobody' $_GET['user'] = '0'; // ?? 返回 '0' // ?: 返回 'nobody' (因 '0' 在 PHP 中為 false)
??,語義精確且無 Notice。@$_GET['key'] ?: 'default' 並關閉 E_NOTICE 或統一封裝 helper 函數。isset() 或 array_key_exists() 顯式判斷,不要依賴 ?:。function input($key, $default = null, $source = 'GET') {
$arr = $_GET; if($source==='POST') $arr = $_POST;
return $arr[$key] ?? $default; // PHP 7
// return @$arr[$key] ?: $default; // PHP 5
}
expr1 ?: expr3官方文檔定義:expr1 ?: expr3 在 expr1 為 TRUE 時返回 expr1,否則返回 expr3。本質是 (expr1) ? (expr1) : (expr3) 的語法糖。
?? 是為「預設值」而生的現代運算子,?: 是歷史相容的「真值判斷」縮寫。根據 PHP 版本與業務語義選擇,並統一封裝輸入獲取層,避免分散在業務代碼中產生不一致行為。