strpos() 返回0表示子字符串在开头,与false在松散比较下均为假值,必须用!== false严格比较;推荐php 8.0+的str_contains()避免歧义。

在 PHP 8.3 中,strpos() 返回 0 表示子字符串**恰好出现在主字符串开头**,这和 false(表示未找到)在松散比较下都为“假值”,所以用 if (strpos(...)) 会误判 0 为“没找到”,导致逻辑错误。
必须用严格比较判断返回值
正确做法是使用全等运算符 === false 来区分 0 和未找到:
-
✘ 错误写法(松散比较):
if (strpos($str, 'a')) { ... }→ 开头是 'a' 时跳过 -
✔ 正确写法(严格比较):
if (strpos($str, 'a') !== false) { ... }→ 匹配到任意位置(含开头)都进分支 - 若只关心是否在开头,可单独判断:
if (strpos($str, 'a') === 0) { ... }
替代方案:用 str_contains() 更安全(PHP 8.0+)
PHP 8.0 起引入了 str_contains(),语义清晰、无返回值歧义,推荐用于单纯判断存在性:
-
if (str_contains($str, 'a')) { ... }→ 找到就为true,否则false - 它不返回位置,所以天然避开
0vsfalse的陷阱 - 注意:如果后续还需位置信息(比如截取或替换),仍需用
strpos()并配合!== false
其他易错点提醒
-
stripos()同样返回0或false,也必须用!== false - 不要用
== 0判断是否在开头——它会把false也当成0(因为false == 0为真) - 函数参数顺序别颠倒:
strpos($haystack, $needle),反了会导致意外结果
核心就一条:只要用 strpos(),结果必须和 false 做全等比较,而不是靠真假值隐式判断。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











