## 比較運算符
比較運算符,如同它們名稱所暗示的,允許對兩個值進行比較。還可以參考 [PHP 類型比較表](http://php.net/manual/zh/types.comparisons.php)看不同類型相互比較的例子。
**比較運算符**
| 例子 | 名稱 | 結果 |
| --- | --- | --- |
| $a == $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 < $b | 小與 | **`TRUE`**,如果 $a 嚴格小于 $b。 |
| $a > $b | 大于 | **`TRUE`**,如果 $a 嚴格大于 $b。 |
| $a <= $b | 小于等于 | **`TRUE`**,如果 $a 小于或者等于 $b。 |
| $a >= $b | 大于等于 | **`TRUE`**,如果 $a 大于或者等于 $b。 |
| $a <=> $b | 太空船運算符(組合比較符) | 當$a小于、等于、大于$b時 分別返回一個小于、等于、大于0的[integer](http://php.net/manual/zh/language.types.integer.php) 值。 PHP7開始提供. |
| $a ?? $b ?? $c | NULL 合并操作符 | 從左往右第一個存在且不為 **`NULL`** 的操作數。如果都沒有定義且不為 **`NULL`**,則返回 **`NULL`**。PHP7開始提供。 |
如果比較一個數字和字符串或者比較涉及到數字內容的字符串,則字符串會被[轉換為數值](http://php.net/manual/zh/language.types.string.php#language.types.string.conversion)并且比較按照數值來進行。此規則也適用于 [switch](http://php.net/manual/zh/control-structures.switch.php) 語句。當用 === 或 !== 進行比較時則不進行類型轉換,因為此時類型和數值都要比對。
```
<?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;
}
?>
```
```
<?php??
//?Integers
echo?1?<=>?1;?//?0
echo?1?<=>?2;?//?-1
echo?2?<=>?1;?//?1
?
//?Floats
echo?1.5?<=>?1.5;?//?0
echo?1.5?<=>?2.5;?//?-1
echo?2.5?<=>?1.5;?//?1
?
//?Strings
echo?"a"?<=>?"a";?//?0
echo?"a"?<=>?"b";?//?-1
echo?"b"?<=>?"a";?//?1
?
echo?"a"?<=>?"aa";?//?-1
echo?"zz"?<=>?"aa";?//?1
?
//?Arrays
echo?[]?<=>?[];?//?0
echo?[1,?2,?3]?<=>?[1,?2,?3];?//?0
echo?[1,?2,?3]?<=>?[];?//?1
echo?[1,?2,?3]?<=>?[1,?2,?1];?//?1
echo?[1,?2,?3]?<=>?[1,?2,?4];?//?-1
?
//?Objects
$a?=?(object)?["a"?=>?"b"];?
$b?=?(object)?["a"?=>?"b"];?
echo?$a?<=>?$b;?//?0
?
$a?=?(object)?["a"?=>?"b"];?
$b?=?(object)?["a"?=>?"c"];?
echo?$a?<=>?$b;?//?-1
?
$a?=?(object)?["a"?=>?"c"];?
$b?=?(object)?["a"?=>?"b"];?
echo?$a?<=>?$b;?//?1
?
//?only?values?are?compared
$a?=?(object)?["a"?=>?"b"];?
$b?=?(object)?["b"?=>?"b"];?
echo?$a?<=>?$b;?//?1
?>
```
對于多種類型,比較運算符根據下表比較(按順序)。
**比較多種類型**
| 運算數 1 類型 | 運算數 2 類型 | 結果 |
| --- | --- | --- |
| [null](http://php.net/manual/zh/language.types.null.php) 或 [string](http://php.net/manual/zh/language.types.string.php) | [string](http://php.net/manual/zh/language.types.string.php) | 將 **`NULL`** 轉換為 "",進行數字或詞匯比較 |
| [bool](http://php.net/manual/zh/language.types.boolean.php) 或 [null](http://php.net/manual/zh/language.types.null.php) | 任何其它類型 | 轉換為 [bool](http://php.net/manual/zh/language.types.boolean.php),**`FALSE`** < **`TRUE`** |
| [object](http://php.net/manual/zh/language.types.object.php) | [object](http://php.net/manual/zh/language.types.object.php) | 內置類可以定義自己的比較,不同類不能比較,相同類和數組同樣方式比較屬性(PHP 4 中),PHP 5 有其自己的[說明](http://php.net/manual/zh/language.oop5.object-comparison.php) |
| [string](http://php.net/manual/zh/language.types.string.php),[resource](http://php.net/manual/zh/language.types.resource.php) 或 [number](http://php.net/manual/zh/language.pseudo-types.php#language.types.number) | [string](http://php.net/manual/zh/language.types.string.php),[resource](http://php.net/manual/zh/language.types.resource.php) 或 [number](http://php.net/manual/zh/language.pseudo-types.php#language.types.number) | 將字符串和資源轉換成數字,按普通數學比較 |
| [array](http://php.net/manual/zh/language.types.array.php) | [array](http://php.net/manual/zh/language.types.array.php) | 具有較少成員的數組較小,如果運算數 1 中的鍵不存在于運算數 2 中則數組無法比較,否則挨個值比較(見下例) |
| [object](http://php.net/manual/zh/language.types.object.php) | 任何其它類型 | [object](http://php.net/manual/zh/language.types.object.php) 總是更大 |
| [array](http://php.net/manual/zh/language.types.array.php) | 任何其它類型 | [array](http://php.net/manual/zh/language.types.array.php) 總是更大 |
**Example #1 標準數組比較代碼**
```
<?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
}
?>
```
- 序言
- 簡介
- PHP是什么?
- PHP能做什么?
- 基本語法
- 類型
- boolean(布爾型)
- integer(整型)
- float(浮點型)
- string(字符串)
- array(數組)
- object(對象)
- callable(可調用)
- resource(資源)
- NULL(無類型)
- 偽類型
- 類型轉換的判別
- 變量
- 基礎
- 預定義變量
- 變量范圍
- 可變變量
- 來自PHP之外的變量
- 常量
- 語法
- 魔術常量
- 表達式
- 運算符
- 運算符優先級
- 算術運算符
- 賦值運算符
- 位運算符
- 比較運算符
- 錯誤控制運算符
- 執行運算符
- 遞增/遞減運算符
- 邏輯運算符
- 字符串運算符
- 數組運算符
- 類型運算符
- 流程控制
- if
- else
- elseif/else if
- 流程控制的替代語法
- while
- do-whille
- for
- foreach
- break
- continue
- switch
- declare
- return
- require
- include
- require_once
- include_once
- goto
- 函數
- 用戶自定義函數
- 函數的參數
- 返回值
- 可變函數
- 內部 (內置)函數
- 匿名函數
- 類與對象
- 簡介
- 基本概念
- 屬性
- 類的自動加載
- 構造函數
- 訪問控制(可見性)