http://php.net/manual/en/language.operators.comparison.php
- 不是用三個等號 "===" 或 "!==" 比較時,會自動進行形態的轉換。
數字跟字串比較時,字串都會先轉成數字再進行比較。在switch中也是一樣會自動進行形態的轉換再比較。
var_dump(0 == "a"); // 0 == 0 -> true 因為"a"轉成數字0 var_dump("1" == "01"); // 1 == 1 -> true 因為"01"轉成數字1 var_dump("10" == "1e1"); // 10 == 10 -> true var_dump(100 == "1e2"); // 100 == 100 -> true switch ("a") { case 0: // 成立,因為"a"轉成數字0 echo "0"; //會輸出0 break; }
- 比較特別的三元運算子(Ternary operator),官網建議盡量不要一個三元運算子中又疊加一個三元運算子,因為PHP的解讀方式,可能不是那麼容易理解。
(It is recommended that you avoid "stacking" ternary expressions. PHP's behaviour when using more than one ternary operator within a single statement is non-obvious)
以下的例子會輸出"X"
var a=1; alert((a==1) ? "X": (a==2)? "Y" : "Z"); //輸出 X
但在PHP中,同樣的例子,PHP會輸出"Y"
$a=1; echo (($a==1) ? "X": ($a==2)? "Y" : "Z"); //輸出 Y
這是因為PHP多個三元運算子放在一起時,PHP會由左至右開始運算比較。
所以以下的程式碼
($a==1) ? "X": ($a==2)? "Y" : "Z";
PHP比較的順序為下:
(($a==1) ? "X": ($a==2))? "Y" : "Z"; //加上小括號,就看的比較清楚了,PHP先運算(($a==1) ? "X": ($a==2)),得到 "X"
然後再進行下一個運算
("X")? "Y" : "Z"; //因為"X"經過形態轉換後是true,所以最後得到 "Y"
所以,我習慣疊加兩個以上的三元運算子時,都會加上小括號,不僅閱讀容易,且不容易採到地雷出錯。 因此,最先的例子,若預期PHP跟JavaScript一樣都輸出"X",只要在第二個三元運算子加上小括號,讓它優先執行即可。
$a=1; echo (($a==1) ? "X": (($a==2)? "Y" : "Z")); //輸出 X
其他:php的不同型態之間比較表
http://www.php.net/manual/en/types.comparisons.php
Expression | gettype() | empty() | is_null() | isset() | boolean : if($x) |
---|---|---|---|---|---|
$x = ""; | string | TRUE | FALSE | TRUE | FALSE |
$x = null | NULL | TRUE | TRUE | FALSE | FALSE |
var $x; | NULL | TRUE | TRUE | FALSE | FALSE |
$x is undefined | NULL | TRUE | TRUE | FALSE | FALSE |
$x = array(); | array | TRUE | FALSE | TRUE | FALSE |
$x = false; | boolean | TRUE | FALSE | TRUE | FALSE |
$x = true; | boolean | FALSE | FALSE | TRUE | TRUE |
$x = 1; | integer | FALSE | FALSE | TRUE | TRUE |
$x = 42; | integer | FALSE | FALSE | TRUE | TRUE |
$x = 0; | integer | TRUE | FALSE | TRUE | FALSE |
$x = -1; | integer | FALSE | FALSE | TRUE | TRUE |
$x = "1"; | string | FALSE | FALSE | TRUE | TRUE |
$x = "0"; | string | TRUE | FALSE | TRUE | FALSE |
$x = "-1"; | string | FALSE | FALSE | TRUE | TRUE |
$x = "php"; | string | FALSE | FALSE | TRUE | TRUE |
$x = "true"; | string | FALSE | FALSE | TRUE | TRUE |
$x = "false"; | string | FALSE | FALSE | TRUE | TRUE |
TRUE | FALSE | 1 | 0 | -1 | "1" | "0" | "-1" | NULL | array() | "php" | "" | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
TRUE | TRUE | FALSE | TRUE | FALSE | TRUE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE |
FALSE | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | TRUE | TRUE | FALSE | TRUE |
1 | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
0 | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | TRUE | FALSE | TRUE | TRUE |
-1 | TRUE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE |
"1" | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
"0" | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE |
"-1" | TRUE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE |
NULL | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | TRUE | TRUE | FALSE | TRUE |
array() | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | TRUE | FALSE | FALSE |
"php" | TRUE | FALSE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE |
"" | FALSE | TRUE | FALSE | TRUE | FALSE | FALSE | FALSE | FALSE | TRUE | FALSE | FALSE | TRUE |
沒有留言:
張貼留言