strpos()查到"0"时返回0,因PHP弱类型中0==false导致误判;正确写法是用!== false严格比较,或PHP 8.0+改用str_contains()。

PHP中strpos()查到字符串"0"时为什么返回false?
因为strpos()在找到匹配位置为0时,会返回整数0,而PHP弱类型下0 == false,直接用if (strpos($str, '0'))会误判为“没找到”。
正确做法是用严格比较判断返回值是否为false:
if (strpos($str, '0') !== false) {
// 确实找到了,哪怕在开头位置
}
常见错误场景:用户输入手机号以"0"开头、配置值为"0"的开关字段、CSV解析中某列值恰好是"0"。
用str_contains()(PHP 8.0+)更安全
该函数只返回布尔值,不暴露位置信息,彻底避开0和false混淆问题:
if (str_contains($str, '0')) {
// 找到了字符'0',逻辑清晰无歧义
}
注意:str_contains()只支持PHP 8.0及以上;若项目还在用7.x,不能直接替换,需先确认版本。
它不区分大小写,也不支持正则,纯做子串存在性判断——这反而是处理"0"这类字面量时的优势。
当"0"是数字还是字符串?类型不一致会导致意外失败
比如从$_GET或JSON解码来的"0"通常是字符串"0",但若被(int)强转过,再传给strpos()就会变成整数0,触发类型警告或静默失败:
-
strpos("abc0def", 0)→ 警告:needle must be of type string -
strpos("abc0def", (string)0)→ 正常,查字符"0"
建议统一用字符串形式传参,必要时显式转换:(string)$needle,尤其当$needle来源不可控时。
批量检查多个可能为"0"的值,别用in_array()默认松散比较
比如in_array('0', [0, 1, 2], true)返回false,因为'0' !== 0;但in_array('0', [0, 1, 2])(松散)会返回true,容易掩盖类型问题。
如果目标数组里混有数字和字符串,且你要精确匹配字符串"0",必须加第三个参数true,并确保所有待查项都是字符串:
$values = array_map('strval', [0, '0', 'zero']);
if (in_array('0', $values, true)) { /* 安全 */ }
否则,松散比较会让'0' == 0 == false == '',结果完全不可靠。
最易被忽略的是:把strpos()当布尔函数用,却不加!== false。这个坑在代码评审里高频出现,尤其当测试数据没覆盖首字符为"0"的情况时,线上才暴露。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











