PHP中FILTER_VALIDATE_INT验证用!==false判断通过是否正确?
首先给出明确结论:你提到的filter_var($variable, FILTER_VALIDATE_INT) !== false写法是完全安全的,可以直接用来判断变量是否符合整数规则,不会出现你担心的弱类型判断误差。
原理说明
filter_var搭配FILTER_VALIDATE_INT参数时的返回规则是固定的:
- 验证通过时:返回转换后的整数类型值,不管这个值是0、正整数还是负整数,类型都是
int,不是布尔值 - 验证不通过时:返回布尔类型的
false
你使用的!==是PHP的强类型不等判断,会同时比对值和变量类型:
- 就算验证通过返回的是
int(0),因为类型是整数,和布尔类型的false类型不一致,所以0 !== false的结果是true,会正常进入判断分支,不会把合法的整数0误判为验证失败 - 只有验证不通过返回布尔
false时,false !== false的结果才是false,不会进入分支
容易踩坑的错误写法对比
真正会触发弱类型问题的是省略强类型判断的写法,比如:
// 错误写法:会把整数0误判为不通过 if(filter_var($variable, FILTER_VALIDATE_INT)) { // 当变量为0的时候不会进入这里 }
这种写法是用了弱类型隐式转换,int(0)会被隐式转换为布尔false,所以会把合法的整数0过滤掉,这才是你需要规避的坑,而你写的强类型判断写法完全不会有这个问题。
测试验证示例
你可以自行用以下测试用例验证:
- 当
$variable = 0:返回int(0),判断条件成立,符合预期 - 当
$variable = "0":返回int(0),判断条件成立,符合预期 - 当
$variable = -123:返回int(-123),判断条件成立,符合预期 - 当
$variable = "123a":返回bool(false),判断条件不成立,符合预期 - 当
$variable = 12.3:返回bool(false),判断条件不成立,符合预期
内容的提问来源于stack exchange,提问作者mahen3d
相关产品推荐
相关产品推荐

