本篇重點
- 介紹
?:
、??
、??=
的使用方式 - JavaScript 沒有
?:
符號相鄰的簡化用法,但可以使用||
來達到類似效果 - PHP 和 JavaScript 判斷假值標準不完全相同
- 了解符號運算子的可使用版本
在開發中,常常會遇到要檢查變數是否有值、是否被設定的情況。為了讓程式碼更簡潔,PHP 和 JavaScript 提供了三種「簡化條件運算子」:
?:
(三元運算子)??
(Null 合併運算子)??=
(Null 合併賦值運算子)
?:
三元運算子
PHP
常見用法(PHP 4+)
?:
是條件運算子(if...else...
)的簡寫
1 | 條件式 ? 成立時的值 : 不成立時的值; |
範例:
1 | $age = isset($_POST['age']) && intval($_POST['age']) > 0 ? intval($_POST['age']) : 0; |
- 如果使用者有傳入
age
,且值大於0
,就使用該值 - 否則預設為
0
簡化用法(PHP 5.3+)
當「條件」與「成立時的值」相同時可省略重複語句
1 | 條件式 ?: 不成立時的值; |
範例:
1 | // $nickname 未設定值 |
- 如果
$nickname
的值存在,返回$nickname
- 如果
$nickname
的值為假值(falsy,如空字串、0、null、false),返回後方的'訪客'
等同於:
1 | $name = $nickname ? $nickname : '訪客' |
JavaScript
?:
是條件運算子(if...else...
)的簡寫
1 | 條件式 ? 成立時的值 : 不成立時的值; |
範例:
1 | let inputAge = null; |
- 如果使用者有傳入
age
,且值大於 0,就使用該值 - 否則預設為
0
??
Null 合併運算子
PHP( 7+)
用來檢查變數是否「被設定」且「不為 null」,如果條件不符,則使用後方預設值,和 isset()
的判斷結果相同
1 | $變數 ?? $預設值; |
範例:
1 | $user = $_GET['user_name'] ?? 'noName'; |
- 如果
$_GET['user_name']
存在且不為null
,就返回$_GET['user_name']
- 否則返回
'noName'
等同於:
1 | $user = isset($_GET['user']) ? $_GET['user'] : '預設使用者'; |
?:
和 ??
的差異比較
?:
和 ??
兩者都有檢查變數是否有值、是否被設定的功用,但判斷標準不完全相同
1 | $value1 = 0 ?: 100; // 100 (因為 0 是假值) |
JavaScript(ES2020+)
用來檢查變數是否「被設定」且「不為 null 或 undefined」,如果條件不符,則使用後方預設值
1 | $變數 ?? $預設值; |
範例:
1 | let inputUserName = null; |
- 如果
inputUserName
存在且不為null
或undefined
,就返回inputUserName
- 否則返回
'noName'
??=
Null 合併賦值運算子
PHP(7.4+)
??
的延伸寫法,如果變數未設定或為 null
自動賦予預設值,否則賦予原值
1 | $變數 ??= $預設值; |
範例:
1 | $_GET['user_name'] ??= 'noName'; |
- 如果
$_GET['user_name']
未設定或為null
,就賦值為'noName'
- 如果已經有設定值(例如
'John'
),則不做任何改變
等同於:
1 | if (!isset($_GET['user_name'])) { |
JavaScript(ES2021+)
??
的延伸寫法,如果變數為 null
或 undefined
自動賦予預設值,否則賦予原值
1 | $變數 ??= $預設值; |
範例:
1 | let user_name = null; |
- 如果
user_name
為null
或undefined
,就賦值為'noName'
- 如果已經有設定值(例如
'John'
),則不做修改
結論
在 PHP 和 JavaScript 中,可以使用 ?:
、??
、??=
提升程式的簡潔性和可讀性,適合應用在表單接收、API 處理等場景!