比較運算符,如同它們名稱所暗示的,允許對兩個值進行比較。
比較運算子
範例 名稱 == $b 等於 TRUE,若型別轉換後 $a 等於 $b。 $a === $b 全等 TRUE,如果 $a 等於 $b,且它們的種類也相同。
$a != $b 不等 TRUE,若型別轉換後 $a 不等於 $b。 $a $b 不等 TRUE,若型別轉換後 $a 不等於 $b。 $a !== $b 不全等 TRUE,如果 $a 不等於 $b,或它們的類型不同。 $a $a > $b 大於 TRUE,若 $a 嚴格大於 $b。 $a $a >= $b 大於等於 TRUE,若 $a 大於或等於 $b。 如果比較一個數字和字串或比較涉及到數字內容的字串,則字串會被轉換為數值並且比較按照數值來進行。此規則也適用於 switch 語句。用 === 或 !== 比較時則不進行型別轉換,因為此時型別和數值都要比較。<?php var_dump(0 == "a"); // 0 == 0 -> true var_dump("1" == "01"); // 1 == 1 -> true var_dump("10" == "1e1"); // 10 == 10 -> true var_dump(100 == "1e2"); // 100 == 100 -> true switch ("a") { case 0: echo "0"; break; case "a": // never reached because "a" is already matched with 0 echo "a"; break; } ?>對於多種類型,比較運算符根據下表比較(按順序)。 比較多種類型 運算數1 型運算數2 型結果 null 或 string 結果 null 或 string 結果 null 或 string 結果
bool 或 null 任何其它類型 轉換為 bool,FALSE object object 內建類別可以定義自己的比較,不同類別不能比較,相同類別和陣列相同方式比較屬性(PHP 4 中有),不同類別不能比較resource 或number string,resource 或number 將字串和資源轉換成數字,依普通數學比較 array array 具有成員的數組較小,如果運算數1 中的鍵數不存在於數組中的數字組無法比較,否則挨個值比較(見下例) object 任何其它類型 object 總是更大 array
Warning:由於浮點數 float 的內部表現方式,不應比較兩個浮點數是否相等。
三元運算子
另一個條件運算子是「?:」(或三元)運算子 。
Example #2 賦預設值
<?php // 数组是用标准比较运算符这样比较的 function standard_array_compare($op1, $op2) { if (count($op1) < count($op2)) { return -1; // $op1 < $op2 } elseif (count($op1) > count($op2)) { return 1; // $op1 > $op2 } foreach ($op1 as $key => $val) { if (!array_key_exists($key, $op2)) { return null; // uncomparable } elseif ($val < $op2[$key]) { return -1; } elseif ($val > $op2[$key]) { return 1; } } return 0; // $op1 == $op2 } ?>
表達式 (expr1) ? (expr2) : (expr3) 在 expr1 求值為 TRUE 時的值為 expr2,在 expr1 求值為 TRUE
自 PHP 5.3 起,可以省略三元運算子中間那部分。表達式 expr1 ?: expr3 在 expr1 求值為 TRUE 時回傳 expr1,否則回傳 expr3。
Note: 注意三元運算子是個語句,因此其求值不是變量,而是語句的結果。如果想透過引用回傳一個變數這點就很重要。在一個透過引用傳回的函數中語句 return $var == 42 ? $a : $b; 將不起作用,以後的 PHP 版本會為此發出警告。
Note:
建議避免將三元運算子堆積在一起使用。當在一條語句中使用多個三元運算子時會造成 PHP 運算結果不清晰:
Example #3 不清晰的三元運算子行為
<?php // Example usage for: Ternary Operator $action = (empty($_POST['action'])) ? 'default' : $_POST['action']; // The above is identical to this if/else statement if (empty($_POST['action'])) { $action = 'default'; } else { $action = $_POST['action']; } ?>