# 比较运算符

等于运算符 `==` 返回两个值类型转换后是否相等。如果比较一个数字和字符串或者比较涉及到数字内容的字符串，则字符串会被转换为数值并且比较按照数值来进行。

```php
<?php

var_dump(0 == 'foo');    // bool(true)
var_dump(1 == '01');     // bool(true)
var_dump('10' == '1e1'); // bool(true)

```

以上规则同样也适用于 `switch` 语句。

```php
<?php

$foo = 'foo';
switch ($foo) {
    case 0:
        var_dump(0);
        break;
    case 'foo':
        var_dump('foo');
        break;
}
// int(0)

```

全等运算符 `===` 返回两个值的类型和数值是否相等。

```php
<?php

var_dump(0 === '0');   // bool(false)
var_dump(100 === 1e2); // bool(false)

```

不等运算符 `!=` 返回两个值类型转换后是否不等。

```php
<?php

var_dump(0b11 != '3');    // bool(false)
var_dump(0 != '001');     // bool(true)
var_dump('foo' != 'bar'); // bool(true)

```

不全等运算符 `!==` 返回两个值的类型或数值是否不等。

```php
<?php

var_dump(0 !== '0');   // bool(true)
var_dump(100 !== 1e2); // bool(true)

```

小于运算符 `<` 返回一个值是否严格小于另一个值。

```php
<?php

var_dump(3 < 3);      // bool(false)
var_dump(3 < 10);     // bool(true)
var_dump(3 < 'foo');  // bool(false)
var_dump(3 < '0010'); // bool(true)

```

大于运算符 `>` 返回一个值是否严格大于另一个值。

```php
<?php

var_dump(3 > 3);      // bool(false)
var_dump(10 > 3);     // bool(true)
var_dump('foo' > 3);  // bool(false)
var_dump('0010' > 3); // bool(true)

```

小于等于运算符 `<=` 返回一个值是否小于或等于另一个值。

```php
<?php

var_dump(3 <= 3);      // bool(true)
var_dump(3 <= 10);     // bool(true)
var_dump(3 <= 'foo');  // bool(false)
var_dump(3 <= '0010'); // bool(true)

```

大于等于运算符 `>=` 返回一个值是否大于或等于另一个值。

```php
<?php

var_dump(3 >= 3);      // bool(true)
var_dump(10 >= 3);     // bool(true)
var_dump('foo' >= 3);  // bool(false)
var_dump('0010' >= 3); // bool(true)

```

太空船运算符（组合比较符） `<=>` 当一个值小于、等于、大于另一个值时分别返回一个小于、等于、大于 0 的整数。

```php
<?php

var_dump(1 <=> 1);                                               // int(0)
var_dump(2 <=> 1);                                               // int(1)
var_dump(1 <=> 2);                                               // int(-1)

var_dump('foo' <=> 'foo');                                       // int(0)
var_dump('foo' <=> 'bar');                                       // int(1)
var_dump('bar' <=> 'foo');                                       // int(-1)

var_dump([] <=> []);                                             // int(0)
var_dump([2, 4, 5] <=> [2, 4, 5]);                               // int(0)
var_dump([2, 4, 5] <=> [2, 4, 4]);                               // int(1)
var_dump([2, 4, 4] <=> [2, 4, 5]);                               // int(-1)

var_dump(['foo' => 'cat'] <=> ['foo' => 'cat']);                 // int(0)
var_dump(['foo' => 'dog'] <=> ['foo' => 'cat']);                 // int(1)
var_dump(['foo' => 'cat'] <=> ['foo' => 'dog']);                 // int(-1)
var_dump(['foo' => 'cat', 'bar' => 'dog'] <=> ['foo' => 'cat']); // int(1)
var_dump(['foo' => 'cat'] <=> ['bar' => 'dog']);                 // int(1)

$foo = (object)['foo' => 'cat'];
$bar = (object)['foo' => 'cat'];
var_dump($foo <=> $bar);                                         // int(0)

$foo = (object)['foo' => 'dog'];
$bar = (object)['foo' => 'cat'];
var_dump($foo <=> $bar);                                         // int(1)

$foo = (object)['foo' => 'cat'];
$bar = (object)['foo' => 'dog'];
var_dump($foo <=> $bar);                                         // int(-1)

$foo = (object)['foo' => 'cat'];
$bar = (object)['bar' => 'dog'];
var_dump($foo <=> $bar);                                         // int(1)

```

另一个条件运算符是 `?:` （或三元运算符）。 `表达式一 ? 表达式二 : 表达式三` 在表达式一求值为 `true` 的时候值为表达式二，在表达式一求值为 `false` 的时候值为表达式三。建议避免将三元运算符堆积在一起使用。当在一条语句中使用多个三元运算符时会造成 PHP 运算结果不清晰。

```php
<?php

$foo = 'foo';
$bar = isset($foo) ? $foo : 'bar';
var_dump($bar); // string(3) "foo"

```

可以省略三元运算符中间那部分。 `表达式一 ?: 表达式二` 在表达式一求值为 `true` 时返回表达式一，否则返回表达式二。

```php
<?php

$foo = 'foo';
$bar = isset($foo) ?: 'bar';
var_dump($bar); // bool(true)

```

`NULL` 合并操作符 `??` 返回从左往右第一个存在且不为 `NULL` 的操作数。如果都没有定义且不为 `NULL`，则返回 `NULL` 。

```php
<?php

$foo = $foo ?? 'foo';
var_dump($foo); // string(3) "foo"

$bar ??= 'bar';
var_dump($bar); // string(3) "bar"

```

