在 php 8 中,字符串与数字比较时不再进行“松散比较”(joke comparison),而是优先将字符串解析为数值。由于 'abc' 无法转换为有效数字,其解析结果为 0,因此 0 == 'abc' 变为 false。而在 php 7 及更早版本中,该表达式会触发松散比较规则,直接返回 true。这一变化旨在消除因隐式类型转换导致的逻辑错误。

PHP 7 中的松散比较行为是怎样的
在 PHP 7 中,当操作数一个是整数,另一个是字符串时,如果字符串看起来像数字,则将其转换为数字进行比较;否则,字符串会被转换为整数 0。对于 'abc' 这种非数字字符串,它被转换为 0,从而与整数 0 相等。

<?php // PHP 7 环境
var_dump(0 == 'abc'); // bool(true)
var_dump('abc' == 0); // bool(true)
var_dump('123' == 123); // bool(true)
var_dump('0x1A' == 26); // bool(false) - 注意:PHP 7 中十六进制字符串不自动转换
?>
PHP 8 中的严格数值转换逻辑是什么
PHP 8 引入了新的比较规则:== 运算符现在首先尝试将两个操作数都转换为数字。如果字符串包含非数字字符(如 'abc'),它将被解析为 0。因此,0 == 'abc' 实际上变成了 0 == 0,但在 PHP 8 的语义中,这被视为类型不匹配的比较,除非使用 == 且两边都是数字。等等,这里需要澄清:PHP 8 中 0 == 'abc' 实际上是 false,因为 'abc' 被转换为 0,但 PHP 8 对这种“数字字符串”的处理更加严格。具体来说,PHP 8 中 == 的行为是:如果一个是数字,另一个是字符串,且字符串不是纯数字,则比较失败。让我们通过代码验证这一点。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。

<?php // PHP 8 环境
var_dump(0 == 'abc'); // bool(false)
var_dump('abc' == 0); // bool(false)
var_dump('123' == 123); // bool(true)
var_dump('0' == 0); // bool(true)
var_dump('0.0' == 0); // bool(true)
?>
为什么 'abc' 在 PHP 8 中被视为非数字字符串
在 PHP 8 中,字符串 'abc' 不被视为数字字符串,因为它不包含任何数字前缀或纯数字内容。当 PHP 尝试将 'abc' 转换为数字时,它会返回 0,但由于比较规则的变化,这种转换不再导致相等性成立。相反,PHP 8 要求更严格的类型匹配,除非两个操作数都是数字,否则不会进行隐式转换。这意味着 0 == 'abc' 在 PHP 8 中直接返回 false,因为没有有效的数字转换路径。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










