2012年4月26日 星期四

PHP的比較運算子(Comparison Operators)


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)
例如: 在JavaScript中,三元運算子中又放一個三元運算子。
以下的例子會輸出"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
Comparisons of $x with PHP functions
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

Loose comparisons with ==
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


沒有留言:

張貼留言