即是 <expression> ? <when true> : <when false> 寫法
不少程式語言都有這種操作方法,但 PHP 有一個小小的使用漏洞要注意
在指派資料前需要作一個簡單的真假測試 Ternary Operator 會經常運用
以 Java 為例
使用 if 寫法
1 2 3 4 5 6 7 8 | int i = 0 ; String parity; if (i % 2 == 0 ){ parity = "even" ; } else { parity = "odd" ; } System.out.println(parity); |
1 2 3 | int i = 0 ; String parity = i % 2 == 0 ? "even" : "odd" ; System.out.println(parity); |
對於 Java 這類有 scope 限制的程式語言,還需要有 if 的 scope 前預先宣告變數型態,才能在 if 定義資料,再在 scope 後使用該變數
使用 Ternary Operator 編寫長度較短,而且不需要使用 scope 可以直接宣告變數型態及定義資料
Ternary Operator 亦可以變化成多重處理 (Nested Ternary Operators)
1 2 3 | int i = 0 ; String color = i % 3 == 0 ? "red" : i % 3 == 1 ? "green" : "blue" ; System.out.println(color); |
但這種 Nested Ternary Operators 在 PHP 上要小心使用
1 | echo true ? 1 : false ? 2 : 3; |
顯而易見,在第一個 Ternary Operator 中已肯定為 true 會輸出 1 ,因此往後的 Ternary Operator 都不需檢查,這是一種 Short Circuit 邏輯
PHP 則會輸出為 2 ,一個較有趣的結果
PHP 的邏輯會將整個 <expression> ? <when true> : <when false> 進行判斷
例子中 true ? 1 : false ? 2 : 3
PHP 先將 true ? 1 : false 進行判斷,得到 1 ,再將 1 ? 2 : 3 進行判斷,由於 PHP 會將 1 當作 true 所以最後得到 2
若果必須要以 Nested Ternary Operators 以 Short Circuit 邏輯,進行宣告型態及定義資料
最好加上 括孤 來強制 Nested Ternary Operators 的次序
即變成
1 | echo (true ? 1 : (false ? 2 : 3)); |
沒有留言 :
張貼留言