在 php 8 中,使用 str_contains() 替代 strpos() !== false 可以显著简化字符串包含关系的判断逻辑。该函数直接返回布尔值,无需处理 false 与空字符串的边界混淆,代码意图更清晰且执行效率更高。

如何替换旧的 strpos 写法
将 strpos($haystack, $needle) !== false 替换为 str_contains($haystack, $needle) 即可。新函数接受被搜索字符串作为第一个参数,搜索子串作为第二个参数,直接返回 true 或 false,消除了类型转换和比较运算符的使用。

$haystack = "Hello World";
$needle = "World";
// PHP 7 及更早版本写法
if (strpos($haystack, $needle) !== false) {
echo "Found";
}
// PHP 8+ 推荐写法
if (str_contains($haystack, $needle)) {
echo "Found";
}预期输出:
Found
立即学习“PHP免费学习笔记(深入)”;
如何处理大小写敏感问题
str_contains() 是严格区分大小写的。如果需要忽略大小写进行匹配,应使用 stripos() 结合 !== false 判断,或者先统一转换为小写再调用 str_contains()。对于简单的忽略大小写场景,推荐使用 mb_stripos()(多字节安全)或 strtolower() 预处理。

$haystack = "Hello World";
$needle = "world";
// str_contains 区分大小写,返回 false
if (str_contains($haystack, $needle)) {
echo "Case Sensitive Match";
} else {
echo "No Case Sensitive Match";
}
// 忽略大小写:方法一,转为小后比较
if (str_contains(strtolower($haystack), strtolower($needle))) {
echo "Case Insensitive Match";
}
// 忽略大小写:方法二,使用 stripos
if (stripos($haystack, $needle) !== false) {
echo "Strpos Ignore Case Match";
}预期输出:
No Case Sensitive Match
Case Insensitive Match
Strpos Ignore Case Match
当 needle 为空字符串时会发生什么
当 $needle 为空字符串时,str_contains() 始终返回 true。这与 strpos() 的行为一致(strpos("abc", "") 返回 0),但 str_contains() 的语义更明确地表达了“任何字符串都包含空串”这一逻辑,避免了开发者对返回值 0 是否代表未找到的疑虑。
$result1 = str_contains("Hello", ""); // true
$result2 = str_contains("", ""); // true
$result3 = str_contains("Hello", "H"); // true
$result4 = str_contains("Hello", "X"); // false预期结果:
true
true
true
false



















