比较运算符 #

一、比较运算符列表 #

运算符 名称 示例 说明
== 等于 $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