PHP ?: 和 ?? 運算子差異

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

?: Ternary Operator

語法:

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

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

如果以 if else 來寫同等於:

if ($expr1) {
    $result = $expr2;
} else {
    $result = $expr3;
}

PHP 5.3+ 可以寫得更簡短:

$result = $expr1 ?: $expr2;

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

Ternary Chaining:

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 語法

$result = $expr1 ?? $expr2;

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

如果以其他寫法來表示:

// as an if statement:
if (isset($expr1)) {
    $result = $expr1;
} else {
    $result = $expr2;
}

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

Coalescing Chaining:

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';
}

結論

兩者差異在於:

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

References