前几天写api,前端发过来的参数约定是数字1-3,按照开发文档,我写了如下代码,
if (!in_array($param, range(0, 3))) { $vo['error_code'] = 101; return $vo; }
后来自己单元测试,发现发送模拟参数’1abc’和’abc’,居然没返回错误码(报错),经查阅PHP手册,得知该函数还有第三个参数,是否进行参数类型比较,默认为FALSE,这就导致字符串’1abc’在和整型int比较时,由于PHP是弱类型语言,会发生隐式类型转换,所以这里’1abc’转换为’1’,同理‘abc’转换为字符串类型’0’,从而返回true;
要避免这个坑,有以下两个方法
1.自行进行强制类型验证
if (!is_int($param) || !in_array($param, range(0, 3))) { $vo['error_code'] = 101; return $vo; }
2.填充in_array()第三个参数为True,函数内部则会进一步检查类型是否相同
if (!in_array($param, range(1, 3),True)) { $vo['error_code'] = 101; return $vo; }