## 比较运算符
比较运算符,如同它们名称所暗示的,允许对两个值进行比较。还可以参考 [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
- 函数
- 用户自定义函数
- 函数的参数
- 返回值
- 可变函数
- 内部 (内置)函数
- 匿名函数
- 类与对象
- 简介
- 基本概念
- 属性
- 类的自动加载
- 构造函数
- 访问控制(可见性)