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,正确
?>
NotePHP 8.0 改进了字符串与数字的松散比较:非纯数字字符串不再自动转为数字,而是把数字转为字符串再比较。这减少了部分历史陷阱,但
===仍然是最安全的选择。
8.3 比较运算符一览
| 运算符 | 名称 | 示例 | 结果 |
|---|---|---|---|
== | 松散等于 | 5 == "5" | true |
=== | 严格等于 | 5 === "5" | false |
!= | 松散不等 | 5 != "6" | true |
<> | 松散不等 | 5 <> "6" | true |
!== | 严格不等 | 5 !== "5" | true |
> | 大于 | 5 > 3 | true |
< | 小于 | 5 < 3 | false |
>= | 大于等于 | 5 >= 5 | true |
<= | 小于等于 | 5 <= 3 | false |
<=> | 太空船(PHP 7+) | 5 <=> 3 | 1 |
太空船运算符返回 -1、0 或 1:
<?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 |
|---|---|---|---|
123 | 123 | true | "123" |
"123" | 123 | true | "123" |
"abc" | 0 | true | "abc" |
"" | 0 | false | "" |
"0" | 0 | false | "0" |
0 | 0 | false | "0" |
0.0 | 0 | false | "0" |
1.5 | 1 | true | "1.5" |
null | 0 | false | "" |
[] | 0 | false | "Array" |
[1] | 1 | true | "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 官方文档,综合改写后所得。