php松散比较将非数字开头字符串转为0,导致in_array(0,['abc'])返回true;应使用in_array($needle,$haystack,true)开启严格模式,并对输入进行trim、类型验证等处理。

因为 PHP 默认用松散比较(==),会把字符串 'abc' 自动转成整数 0,导致 0 == 'abc' 成立,所以 in_array(0, ['abc']) 返回 true。
松散比较下字符串怎么转数字
PHP 规定:非数字开头的字符串转整数时结果为 0。例如:
-
intval('abc')→0 -
intval('hello123')→0(只看开头) -
intval('123xyz')→123(开头是数字才取有效部分)
常见弱类型误判例子
这些在非严格模式下都会返回 true,但业务上通常不希望这样:
in_array(0, ['abc', 'def'])-
in_array('', [0])(空字符串转0) -
in_array(false, [0])(false转0) -
in_array('0123', [123])(字符串前导零被忽略)
规避弱类型问题的实用方法
核心是让比较既看值、也看类型:
- 始终传入第三个参数
true:in_array($needle, $haystack, true) - 对用户输入提前清理:
trim()去首尾空白,strtolower()统一小写(如需忽略大小写) - 验证数据来源:检查
$_POST键是否存在,避免null或未定义值参与比较 - 敏感场景(如权限校验、白名单)绝不依赖默认行为,强制开启严格模式
不复杂但容易忽略











