news 2026/5/6 22:11:40

HoRain云--PHP类型比较终极避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--PHP类型比较终极避坑指南

🎬 HoRain 云小助手:个人主页

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

目录

⛳️ 推荐

一、两张表看懂 PHP 比较

1️⃣ 宽松比较(==,PHP 特色)

2️⃣ 严格比较(===,推荐)

二、==的比较规则(简化版)

字符串 vs 数字

bool 的坑

null 的坑

三、经典面试题 & 真实 Bug

❌ 登录绕过(历史漏洞)

四、数组比较

五、empty()/ isset()/ is_*系列

1️⃣ empty()

2️⃣ isset()

3️⃣ 类型判断函数

六、PHP 8+ 的类型比较改进

✅ 严格类型模式(强烈推荐)

七、比较运算符总结

八、最佳实践(非常重要)

九、一张终极对照表

十、你可以继续深入的方向


PHP 的类型比较是最容易踩坑、也最能体现 PHP 历史设计的地方。下面我按「直观 → 原理 → 实战 → 建议」系统讲清楚。


一、两张表看懂 PHP 比较

1️⃣ 宽松比较(==,PHP 特色)

只比较“值”,不比较“类型”

比较

结果

原因

"0" == 0

✅ true

字符串转数字

"123abc" == 123

✅ true

字符串转整型

"0" == false

✅ true

都当成假

"" == false

✅ true

空字符串为假

"0.0" == 0

✅ true

数值相等

null == ""

✅ true

都视为空

[1] == true

✅ true

非空数组为真

⚠️这是 PHP Bug 和安全漏洞的主要来源


2️⃣ 严格比较(===,推荐)

值和类型都必须相同

比较

结果

"0" === 0

❌ false

0 === 0.0

❌ false

false === 0

❌ false

null === ""

❌ false

[1] === [1]

✅ true

永远更安全


二、==的比较规则(简化版)

PHP 内部执行类型 juggling(类型自动转换)

字符串 vs 数字

"123" == 123 // true "123abc" == 123 // true "abc" == 0 // true(无法转数字 → 0)

bool 的坑

false == 0 // true false == "" // true false == "0" // true false == [] // true

null 的坑

null == "" // true null == 0 // true null == false // true

三、经典面试题 & 真实 Bug

❌ 登录绕过(历史漏洞)

if ($inputPassword == $dbPassword) { login(); }

如果:

$dbPassword = "0e12345"; $inputPassword = "0";

➡️可能登录成功

✅ 正确做法:

hash_equals($dbPassword, $inputPassword);

四、数组比较

[1, 2] == [1, 2]; // true [1, 2] === [1, 2]; // true ["a" => 1] == [1]; // false

⚠️ 注意顺序和键名


五、empty()/isset()/is_*系列

1️⃣empty()

empty(""); // true empty("0"); // true ⚠️ empty(0); // true empty([]); // true empty(null); // true

2️⃣isset()

isset($a); // false(未定义) isset($a[0]); // false

3️⃣ 类型判断函数

is_int($x) is_string($x) is_array($x) is_bool($x) is_null($x)

==安全得多


六、PHP 8+ 的类型比较改进

✅ 严格类型模式(强烈推荐)

declare(strict_types=1); function add(int $a, int $b): int { return $a + $b; }
add("5", "10"); // ❌ TypeError

七、比较运算符总结

运算符

行为

==

自动类型转换

===

不转换,严格

!=

松散不等

!==

严格不等

<>

!=

<=>

太空船(返回 -1/0/1)

1 <=> 2 // -1 2 <=> 2 // 0 3 <=> 2 // 1

八、最佳实践(非常重要)

永远优先使用:

=== !==

不要相信用户输入

if ($_GET['id'] === '123') {}

使用类型声明

function foo(string $x): void {}

密码 / token 用hash_equals()


九、一张终极对照表

场景

推荐

业务逻辑比较

===

数组索引

array_key_exists()

空值判断

null === $x

字符串相等

strcmp()/hash_equals()

数值计算

明确(int)/(float)

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 22:05:11

如何快速掌握Android位置模拟:3步配置完整指南 [特殊字符]

如何快速掌握Android位置模拟&#xff1a;3步配置完整指南 &#x1f4cd; 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation Android位置模拟工具&#xff08;FakeLocation&#xff…

作者头像 李华
网站建设 2026/5/6 22:01:18

KMS_VL_ALL_AIO:3分钟实现Windows和Office智能激活的终极解决方案

KMS_VL_ALL_AIO&#xff1a;3分钟实现Windows和Office智能激活的终极解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 在当今数字化工作环境中&#xff0c;Windows操作系统和Office办公套…

作者头像 李华