簡單介紹 ?:?? 兩者的差異。


?: Ternary Operator

語法:

1
$result = ($expr1) ? $expr2 : $expr3;

$expr1true,return $expr2,否則 return $expr3


如果以 if else 來寫同等於:

1
2
3
4
5
if ($expr1) {
$result = $expr2;
} else {
$result = $expr3;
}


PHP 5.3+ 可以寫得更簡短:

1
$result = $expr1 ?: $expr2;

$expr1true,return $expr1,否則 return $expr2


Ternary Chaining:

1
2
3
4
5
6
7
8
9
10
11
12
echo 0 ?: 1 ?: 2 ?: 3; // output: 1

// same as, output: 1
if (0) {
echo 0;
} elseif (1) {
echo 1;
} elseif (2) {
echo 2;
} else {
echo 3;
}


?? Null Coalescing Operator

PHP 7 語法

1
$result = $expr1 ?? $expr2;

$expr1 不為 null,return $expr1,否則 return $expr2


如果以其他寫法來表示:

1
2
3
4
5
6
7
8
9
// as an if statement:
if (isset($expr1)) {
$result = $expr1;
} else {
$result = $expr2;
}

// as ternary operator:
$result = isset($expr1) ? $expr1 : $expr2;


Coalescing Chaining:

1
2
3
4
5
6
7
8
9
10
11
12
echo $x ?? $y ?? $z ?? 'empty'; // output: 'empty'

// same as, output: 'empty'
if (isset($x)) {
echo $x;
} elseif (isset($y)) {
echo $y;
} elseif (isset($z)) {
echo $z;
} else {
echo 'default';
}


結論

兩者差異在於:

  • ?: 是用 if($x) (也就是 if(!empty($x))),判斷是否為 true
  • ?? 是用 if(isset($x) (也就是 if (!is_null($x)),判斷是否不為 null

關於 empty()isset() 的差異可以參考我之前寫的文章 PHP empty() 和 isset() 差別


References