比较运算符 #
一、比较运算符列表 #
| 运算符 | 名称 | 示例 | 说明 |
|---|---|---|---|
| == | 等于 | $a == $b | 值相等(类型转换后) |
| === | 全等 | $a === $b | 值和类型都相等 |
| != | 不等 | $a != $b | 值不相等 |
| <> | 不等 | $a <> $b | 值不相等 |
| !== | 不全等 | $a !== $b | 值或类型不相等 |
| < | 小于 | $a < $b | $a小于$b |
| > | 大于 | $a > $b | $a大于$b |
| <= | 小于等于 | $a <= $b | $a小于等于$b |
| >= | 大于等于 | $a >= $b | $a大于等于$b |
| <=> | 太空船 | $a <=> $b | 比较返回-1/0/1 |
二、等于与全等 #
2.1 松散比较(==) #
比较时会进行类型转换:
php
<?php
var_dump(1 == "1");
var_dump(1 == true);
var_dump(0 == false);
var_dump(0 == "");
var_dump(0 == "hello");
var_dump("100" == "1e2");
var_dump(null == 0);
var_dump(null == "");
var_dump(null == false);
2.2 严格比较(===) #
比较值和类型,不进行类型转换:
php
<?php
var_dump(1 === 1);
var_dump(1 === "1");
var_dump(1 === true);
var_dump(0 === false);
var_dump(null === 0);
var_dump("" === null);
2.3 推荐使用严格比较 #
php
<?php
$id = $_GET['id'] ?? 0;
if ($id === 0) {
echo "ID为0";
}
if ($id === "0") {
echo "ID为字符串0";
}
if ($id == 0) {
echo "ID等于0(可能包含空字符串、null等)";
}
三、不等比较 #
3.1 松散不等(!=、<>) #
php
<?php
var_dump(1 != "2");
var_dump(1 != "1");
var_dump(1 != true);
var_dump(0 != "");
var_dump(0 != "hello");
3.2 严格不等(!==) #
php
<?php
var_dump(1 !== "1");
var_dump(1 !== 1);
var_dump(0 !== false);
var_dump(null !== "");
四、大小比较 #
4.1 数字比较 #
php
<?php
var_dump(5 > 3);
var_dump(5 < 3);
var_dump(5 >= 5);
var_dump(5 <= 3);
var_dump(3.14 > 3);
4.2 字符串比较 #
php
<?php
var_dump("a" < "b");
var_dump("abc" < "abd");
var_dump("10" > "9");
var_dump("10" > 9);
4.3 字符串数字比较 #
php
<?php
var_dump("10" > "9");
var_dump("10" > 9);
var_dump("abc" > 1);
五、太空船运算符(<=>) #
PHP 7+ 引入,用于三向比较:
5.1 返回值 #
| 情况 | 返回值 |
|---|---|
| $a < $b | -1 |
| $a == $b | 0 |
| $a > $b | 1 |
5.2 数字比较 #
php
<?php
echo 1 <=> 2;
echo 2 <=> 1;
echo 1 <=> 1;
5.3 字符串比较 #
php
<?php
echo "a" <=> "b";
echo "b" <=> "a";
echo "a" <=> "a";
5.4 数组比较 #
php
<?php
echo [] <=> [];
echo [1, 2, 3] <=> [1, 2, 4];
echo [1, 2, 3] <=> [1, 2, 2];
5.5 用于排序 #
php
<?php
$numbers = [3, 1, 4, 1, 5, 9, 2, 6];
usort($numbers, fn($a, $b) => $a <=> $b);
print_r($numbers);
usort($numbers, fn($a, $b) => $b <=> $a);
print_r($numbers);
六、PHP 8 比较改进 #
6.1 字符串与数字比较 #
PHP 8 中,字符串与数字比较时,数字转为字符串:
php
<?php
var_dump("10" > "9");
var_dump("10" > 9);
6.2 PHP 7 vs PHP 8 #
php
<?php
var_dump("10" > "9");
var_dump("10" > 9);
七、类型比较表 #
7.1 与 true/false 比较 #
| 表达式 | == true | == false | === true | === false |
|---|---|---|---|---|
| true | true | false | true | false |
| false | false | true | false | true |
| 1 | true | false | false | false |
| 0 | false | true | false | false |
| -1 | true | false | false | false |
| “1” | true | false | false | false |
| “0” | false | true | false | false |
| “” | false | true | false | false |
| null | false | true | false | false |
| [] | false | true | false | false |
7.2 松散比较表 #
| null | true | false | 1 | 0 | -1 | “1” | “0” | “” | “php” | [] | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| null | true | false | true | false | true | false | false | true | true | false | true |
| true | false | true | false | true | false | true | true | false | false | true | false |
| false | true | false | true | false | true | false | false | true | true | false | true |
| 1 | false | true | false | true | false | false | true | false | false | false | false |
| 0 | true | false | true | false | true | false | false | true | true | true | false |
| -1 | false | true | false | false | false | true | false | false | false | false | false |
| “1” | false | true | false | true | false | false | true | false | false | false | false |
| “0” | true | false | true | false | true | false | false | true | false | false | false |
| “” | true | false | true | false | true | false | false | false | true | false | false |
| “php” | false | true | false | false | true | false | false | false | false | true | false |
| [] | true | false | true | false | false | false | false | false | false | false | true |
八、比较函数 #
8.1 strcmp() #
二进制安全字符串比较:
php
<?php
echo strcmp("abc", "abc");
echo strcmp("abc", "abd");
echo strcmp("abd", "abc");
8.2 strcasecmp() #
不区分大小写比较:
php
<?php
echo strcasecmp("ABC", "abc");
echo strcasecmp("abc", "ABD");
8.3 strncmp() #
比较前n个字符:
php
<?php
echo strncmp("abcde", "abcfg", 3);
echo strncmp("abcde", "abcfg", 4);
8.4 version_compare() #
版本号比较:
php
<?php
var_dump(version_compare("8.0.0", "7.4.0", ">"));
var_dump(version_compare("8.0.0", "8.1.0", "<"));
var_dump(version_compare("8.0.0", "8.0.0", "=="));
九、实际应用 #
9.1 条件判断 #
php
<?php
$age = 18;
if ($age >= 18) {
echo "成年人";
} elseif ($age >= 13) {
echo "青少年";
} else {
echo "儿童";
}
9.2 数据验证 #
php
<?php
function validateId($id): bool
{
return $id !== null && $id > 0;
}
function validateStatus($status): bool
{
return in_array($status, ['active', 'inactive'], true);
}
9.3 排序 #
php
<?php
$users = [
['name' => 'John', 'age' => 25],
['name' => 'Jane', 'age' => 30],
['name' => 'Bob', 'age' => 20],
];
usort($users, fn($a, $b) => $a['age'] <=> $b['age']);
print_r($users);
十、最佳实践 #
10.1 使用严格比较 #
php
<?php
if ($value === null) {
}
if ($value !== '') {
}
if ($id > 0) {
}
10.2 避免隐式转换 #
php
<?php
if (strpos($str, 'needle') !== false) {
}
if (strpos($str, 'needle') === 0) {
}
10.3 明确类型检查 #
php
<?php
function process(int $id, string $name): void
{
if ($id <= 0) {
throw new InvalidArgumentException("ID必须大于0");
}
if ($name === '') {
throw new InvalidArgumentException("名称不能为空");
}
}
十一、总结 #
本章学习了:
- 松散比较(==)与严格比较(===)
- 不等比较(!=、!==)
- 大小比较(<、>、<=、>=)
- 太空船运算符(<=>)
- PHP 8 比较改进
- 比较函数
下一章将学习逻辑运算符。
最后更新:2026-03-26