str_contains()对空字符串返回true,因数学上空字符串是任意字符串的子串,PHP内部对$needle===''直接返回true;需业务排除时应显式判断$needle!==''。

在 PHP 8.0 中,str_contains() 函数判断空字符串('')时,**返回 true**,只要被搜索的字符串本身也是空字符串,或者在非空字符串中“包含”空字符串 —— 这是符合 PHP 的定义和底层实现逻辑的。
为什么空字符串会被认为“包含”空字符串?
PHP 官方将 str_contains($haystack, $needle) 定义为:检查 $needle 是否作为子串**出现在** $haystack 中。而根据计算机科学中的字符串理论,**空字符串是任意字符串的子串**(包括它自己),这是数学上公认的约定(空集是任何集合的子集,类比而来)。
PHP 内部实际调用的是类似 strstr() 的逻辑,并对空 $needle 做了明确处理:只要 $needle === '',就直接返回 true,不进行实际搜索。
常见情况与结果示例
-
str_contains('hello', '')→ true -
str_contains('', '')→ true -
str_contains('abc', '')→ true -
str_contains('test', 'x')→ false -
str_contains('', 'a')→ false(空字符串不含非空字符)
注意事项
这个行为不是 bug,而是有意设计,与 mb_strpos($haystack, $needle) !== false 等价逻辑一致。如果你的业务逻辑需要排除空字符串匹配(例如校验用户输入是否“真正包含某关键词”),需**显式判断 $needle !== '' 再调用 str_contains()**:
立即学习“PHP免费学习笔记(深入)”;
if ($needle !== '' && str_contains($haystack, $needle)) { ... }
兼容性提醒
str_contains() 是 PHP 8.0 新增函数,低版本不可用。如需兼容旧版,可用 polyfill:function str_contains(string $haystack, string $needle): bool { return $needle === '' || strpos($haystack, $needle) !== false; }



















