php 8.0 将字符串比较从弱类型强制转换改为严格的类型检查,导致包含数字的字符串在相等性判断中不再被当作数值处理,同时 `strpos()` 和 `str_contains()` 等函数对非字符串输入的容忍度降低。升级后,原本依赖自动转换的代码会因类型不匹配返回 false 或抛出错误,需显式转换输入类型或使用严格比较逻辑。

字符串相等比较行为变化
PHP 8.0 移除了字符串与数字之间的松散类型转换,`==` 运算符现在严格检查类型。若左侧为字符串,右侧为整数,即使值相同也会返回 false。例如 '123' == 123 在 PHP 7.4 中为 true,但在 PHP 8.0 中为 false。必须使用 `===` 进行严格比较,或手动将字符串转换为数字后再比较。

<?php
// PHP 7.4: true (loose comparison)
var_dump('123' == 123);
// PHP 8.0: false (strict type check)
var_dump('123' == 123);
// Correct approach in PHP 8.0:
var_dump((int)'123' === 123); // true
var_dump('123' === (string)123); // true
预期结果:第一行输出 bool(false),第二行输出 bool(true)。这表明类型一致性是 PHP 8.0 比较的核心要求。
立即学习“PHP免费学习笔记(深入)”;
字符串查找函数行为变化
PHP 8.0 引入了 `str_contains()` 函数,并强化了 `strpos()` 的类型检查。`strpos()` 不再接受非字符串参数,若传入 null 或数组会抛出 TypeError。`str_contains()` 同样要求两个参数均为字符串,否则报错。这消除了 PHP 7.4 中因隐式转换导致的意外匹配。

<?php
// PHP 7.4: returns false (implicit conversion)
var_dump(strpos(null, 'test'));
// PHP 8.0: throws TypeError
try {
var_dump(strpos(null, 'test'));
} catch (TypeError $e) {
echo 'Error: ' . $e->getMessage();
}
// New function in PHP 8.0
var_dump(str_contains('hello world', 'world')); // true
var_dump(str_contains('hello world', null)); // TypeError
预期结果:PHP 7.4 输出 bool(false),PHP 8.0 抛出异常。新函数 `str_contains()` 提供更直观的布尔返回值,避免与 0 索引混淆。
基于空字符串输入的具体问题
当输入为空字符串时,PHP 8.0 的行为更加一致。`strlen('')` 返回 0,`strpos('', 'a')` 返回 false,`str_contains('', 'a')` 返回 false。这些结果在 PHP 7.4 和 8.0 中相同,但类型检查更严格,确保不会因空值引发未定义行为。



















