2015年8月3日星期一

PHP 的 Ternary Operator 的使用安全

Ternary Operator 中文是三元運算子
即是 <expression> ? <when true> : <when false> 寫法
不少程式語言都有這種操作方法,但 PHP 有一個小小的使用漏洞要注意

在指派資料前需要作一個簡單的真假測試 Ternary Operator 會經常運用
以 Java 為例
使用 if 寫法
int i = 0;
String parity;
if (i % 2 == 0){
    parity = "even";
} else {
    parity = "odd";
}
System.out.println(parity);
使用 Ternary Operator 寫法
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)
int i = 0;
String color = i % 3 == 0 ? "red" : i % 3 == 1 ? "green" : "blue";
System.out.println(color);
在 <when true> 或 <when false> 或兩者同時再編寫 Ternary Operator

但這種 Nested Ternary Operators 在 PHP 上要小心使用
echo true ? 1 : false ? 2 : 3;
在 Java 輸出 1 (Java 使用 System.out.println)
顯而易見,在第一個 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 的次序
即變成
echo (true ? 1 : (false ? 2 : 3));
避免出現非預期資料

沒有留言 :

發佈留言