应使用 filter_var 配合 FILTER_VALIDATE_INT 而非 is_numeric 判断可安全转整型,因其能拒绝小数、空格、指数等非法格式,并校验取值范围,避免隐式截断与精度丢失。
is_numeric 不能准确判断是否可安全转为整型
is_numeric 只是检查字符串是否“看起来像数字”,包括科学计数法、带符号、带空格、甚至十六进制前缀(如 "0x1A")都会返回 true,但它完全不管这个值转成 int 后会不会溢出、截断或丢失精度。比如 "123.45"、" 42 "、"1e3" 都过得了 is_numeric,但强制转 (int) 后分别是 123、42、1000——看似没问题,实则隐式丢精度,且无法区分原始意图。
用 filter_var 配合 FILTER_VALIDATE_INT 更可靠
真正想确认“这个值能无损、明确、可预期地转成整型”,应该用 filter_var 验证整数合法性,它默认拒绝小数点、指数符号、空白包裹等干扰:
-
filter_var("123", FILTER_VALIDATE_INT)→ 返回123 -
filter_var("123.45", FILTER_VALIDATE_INT)→ 返回false -
filter_var(" 42 ", FILTER_VALIDATE_INT)→ 返回false(默认不忽略空白) - 如需支持首尾空格,加选项:
filter_var(" 42 ", FILTER_VALIDATE_INT, ["flags" => FILTER_FLAG_STRIP_WHITESPACE])
注意:它也受 PHP_INT_MIN/PHP_INT_MAX 限制,超出范围会返回 false,这点比 (int) 强制转换更安全。
强制转换前必须校验范围与类型一致性
即使通过了 filter_var,也要留意业务语义。比如 ID 字段要求正整数,但 "-5" 也能过验证;这时应叠加条件:
立即学习“PHP免费学习笔记(深入)”;