<?php
$a = 2;
echo
$a == 1 ? 'one' :
$a == 2 ? 'two' :
$a == 3 ? 'three' :
$a == 4 ? 'four' : 'other';
// 直覺預期:'two'
// 實際輸出:'four'
?>
PHP 三元運算子 **左結合**,而非大多數語言(C、Java、JavaScript)的右結合。上述程式碼實際解析為:
<?php echo (((($a == 1 ? 'one' : $a == 2) ? 'two' : $a == 3) ? 'three' : $a == 4) ? 'four' : 'other'); ?>
$a == 1 → falsefalse ? 'one' : $a == 2 → $a == 2 → truetrue ? 'two' : $a == 3 → 'two'(字串非空 → true)'two' ? 'three' : $a == 4 → 'three'(字串非空 → true)'three' ? 'four' : 'other' → 'four'<?php
echo
($a == 1) ? 'one' :
(($a == 2) ? 'two' :
(($a == 3) ? 'three' :
(($a == 4) ? 'four' : 'other')));
// 輸出:'two' ✅
?>
<?php // 手冊範例 echo (true ? 'true' : false ? 't' : 'f'); // 輸出 't'(非預期 'true') // 等價於 echo ((true ? 'true' : 'false') ? 't' : 'f'); // 'true' 非空 → true → 't' ?>
if/elseif/else 或 match (PHP 8.0+):<?php
// PHP 8.0+ match 表達式(嚴格比較、無型別轉換、回傳值)
$result = match (true) {
$a == 1 => 'one',
$a == 2 => 'two',
$a == 3 => 'three',
$a == 4 => 'four',
default => 'other',
};
echo $result; // 'two' ✅
?>
上述過程中發生多次 字串轉布林:非空字串 'two'、'three' 皆為 true。這也是 PHP 鬆散比較特性導致的連鎖效應。
💡 總結:PHP 三元運算子左結合是歷史遺留設計,巢狀使用時必須加括號,或改用
match(PHP 8.0+)獲得更安全、可讀的語法。