首页 / PHP 入门教程 / PHP 类型比较与转换

PHP 入门教程

PHP 类型比较与转换

本教程共 65 篇 · 第 8 篇 · 更新于 2026-07-24 · 约 4 分钟阅读

PHPPHP8类型比较类型转换严格比较松散比较

8. PHP 类型比较与转换

本节目标:理解松散比较和严格比较的区别,掌握类型转换规则。学完你能避免常见的类型比较陷阱。

8.1 松散比较 vs 严格比较

PHP 提供两种比较方式,结果可能截然不同:

<?php
$a = 5;       // 整数
$b = "5";     // 字符串

// 松散比较:== 只比较值,不比较类型
var_dump($a == $b);   // true(字符串"5"被转为整数 5)

// 严格比较:=== 同时比较值和类型
var_dump($a === $b);  // false(整数 !== 字符串)
?>
Tip

始终优先使用 ===!==。松散比较 == 的隐式转换规则复杂,容易引入 bug。

8.2 松散比较的陷阱

PHP 的隐式类型转换会导致许多意外结果:

<?php
// PHP 7.x 中 0 == "hello" 为 true,但 PHP 8.0+ 已修复
var_dump(0 == "hello");       // PHP 8.0+: false!数字被转为字符串比较
var_dump(0 === "hello");      // false,正确

var_dump(true == "hello");    // true!非空字符串转为 true
var_dump(true === "hello");   // false,正确

var_dump(null == "");         // true
var_dump(null === "");        // false,正确

// PHP 7.x 中 100 == "100abc" 为 true,但 PHP 8.0+ 已修复
var_dump(100 == "100abc");    // PHP 8.0+: false!非纯数字字符串不再转整数
var_dump(100 === "100abc");   // false,正确
?>
Note

PHP 8.0 改进了字符串与数字的松散比较:非纯数字字符串不再自动转为数字,而是把数字转为字符串再比较。这减少了部分历史陷阱,但 === 仍然是最安全的选择。

8.3 比较运算符一览

运算符名称示例结果
==松散等于5 == "5"true
===严格等于5 === "5"false
!=松散不等5 != "6"true
<>松散不等5 <> "6"true
!==严格不等5 !== "5"true
>大于5 > 3true
<小于5 < 3false
>=大于等于5 >= 5true
<=小于等于5 <= 3false
<=>太空船(PHP 7+)5 <=> 31

太空船运算符返回 -101

<?php
echo 5 <=> 3;   // 1(左边大)
echo 5 <=> 5;   // 0(相等)
echo 3 <=> 5;   // -1(右边大)

// 常用于排序比较
$numbers = [3, 1, 4, 1, 5];
usort($numbers, fn($a, $b) => $a <=> $b);
print_r($numbers);  // [1, 1, 3, 4, 5]
?>

8.4 自动类型转换

PHP 会在需要时自动转换类型:

<?php
// 算术运算
$a = "10" + 5;      // 整数 15(字符串转为整数)
$b = "10.5" + 5;    // 浮点数 15.5

// 字符串连接
$c = 10 . "个苹果"; // "10个苹果"(整数转为字符串)

// 条件判断
if ("hello") {      // true(非空字符串)
    echo "真";
}

if (0) {            // false
    echo "假";
}
?>

8.5 强制类型转换

你可以主动指定转换目标类型:

<?php
$val = "123.45abc";

// 临时转换,不改变原变量
$int = (int) $val;        // 123
$float = (float) $val;    // 123.45
$string = (string) 123;   // "123"
$bool = (bool) "hello";   // true
$array = (array) "hi";    // ["hi"]

var_dump($int, $float);
?>

其他转换方式:

<?php
$val = "456";

// 使用 intval() 等函数
$int = intval($val);
$float = floatval($val);
$str = strval(789);

// 使用 settype() 直接修改变量类型
$var = "100";
settype($var, "integer");  // $var 现在是整数 100
var_dump($var);
?>

8.6 类型转换规则速查

原始值转为 int转为 bool转为 string
123123true"123"
"123"123true"123"
"abc"0true"abc"
""0false""
"0"0false"0"
00false"0"
0.00false"0"
1.51true"1.5"
null0false""
[]0false"Array"
[1]1true"Array"

8.7 避免陷阱的最佳实践

<?php
// 1. 检查字符串是否为合法数字后再比较
$input = "100abc";
if (is_numeric($input)) {
    $num = (int) $input;
}

// 2. 密码/令牌比较必须用 ===
$token = $_GET['token'] ?? '';
if ($token === 'secret123') {
    echo "验证通过";
}

// 3. 检查空值用严格判断
$value = getValue();  // 可能返回 null、false、0 或 ""
if ($value === null) {
    echo "没有值";
}
if ($value === '') {
    echo "空字符串";
}

// 4. 类型声明减少隐式转换问题
function calculate(int $a, int $b): int {
    return $a + $b;
}
?>
Note

以上 === 严格比较的写法在 PHP 所有版本中都适用。加上类型声明能让代码更安全,从源头减少隐式转换问题。


来源:参考了 w3cschool「PHP 运算符」、runoob「PHP 类型比较」以及 php.net 官方文档,综合改写后所得。