strpos返回0时被当成false是因为PHP松散比较将0与false等同,正确判断应使用!== false;UTF-8中文需用mb_strpos并同样判!== false;所有类似函数均须严格比较。

strpos返回0时为什么会被当成false
因为PHP的松散比较(==)会把整数0、空字符串""、null和布尔值false全都视为“相等”。而strpos()在子串恰好出现在开头时,返回的就是0——这不是错误,是合法的位置索引。但写成if (strpos($str, 'a') == false),0 == false结果为true,逻辑就彻底反了。
=== false才是安全的判断方式
严格比较(===)同时校验值和类型:0 === false是false,false === false才是true。只有当真没找到(返回布尔false)时,条件才成立。
- 正确写法:
if (strpos($str, 'x') !== false)表示“找到了” - 错误写法:
if (strpos($str, 'x'))或if (strpos($str, 'x') == true),开头命中即失效 - 哪怕你只关心“是否存在”,也必须用
!== false,不能省略===或换成!=
中文场景下还得多一层防坑
strpos()是按字节找的,UTF-8里一个中文占3个字节,用它查'你好'大概率返回false——不是不存在,是字节对不上。这时候不能硬调=== false来“修逻辑”,得换函数。
- 改用
mb_strpos($str, '你好', 0, 'UTF-8'),第四个参数'UTF-8'不能省 - 它的返回值同样要判
=== false,规则完全一致 - 别依赖
iconv_strpos,它已废弃且行为不统一
strrpos也逃不开=== false
提取文件扩展名时常用strrpos($filename, '.') 找最后一个点,但它同样可能返回0(比如'.gitignore')。用== false会把这种合法情况误判为“没找到”,导致substr()出错或静默失败。
立即学习“PHP免费学习笔记(深入)”;
真正容易被忽略的是:所有以位置为返回值、失败返回false的PHP字符串函数(strpos、stripos、strrpos、mb_strpos、strstr的变体等),只要涉及条件判断,=== false就是铁律——少一个=,线上就可能多一个深夜告警。



















