
PHP整型最大值取决于平台和编译选项
PHP的int不是固定大小,它直接映射到底层C的long类型,所以32位系统通常是±2147483647(即PHP_INT_MAX为2147483647),64位系统通常是±9223372036854775807。别硬记数字——用内置常量最可靠。
-
PHP_INT_MAX:当前环境最大有符号整型值 -
PHP_INT_MIN:当前环境最小有符号整型值 -
PHP_INT_SIZE:以字节为单位,通常是4或8
运行var_dump(PHP_INT_MAX, PHP_INT_SIZE);一眼看清你的环境。别靠phpinfo()查,它不直接显示这些常量。
用filter_var()校验整数范围比手工比较更安全
很多人写if ($n > PHP_INT_MAX),这本身就会溢出——超限值在进到if前可能已被截断或转成float,判断失效。正确做法是用过滤器提前拦截。
-
filter_var($input, FILTER_VALIDATE_INT, ['options' => ['min_range' => PHP_INT_MIN, 'max_range' => PHP_INT_MAX]])能真正拒绝越界输入 - 注意:该过滤对字符串有效,但对已溢出的
float(如9e18)可能返回false或意外整数,务必确保输入是字符串或明确可控类型 - Web表单提交的数字默认是字符串,适合直接过滤;数据库读出的数值若来自不可信源,先
strval()再过滤更稳妥
intval()和强制转换(int)在溢出时行为不一致
两者都可能静默截断,但细节不同:32位环境下intval("2147483648")返回2147483647(上限),而(int)"2147483648"可能返回-2147483648(回绕)。这不是bug,是底层C转换规则差异。
立即学习“PHP免费学习笔记(深入)”;
- 永远别依赖溢出后的值有意义
- 需要截断逻辑时,显式用
min(max($n, PHP_INT_MIN), PHP_INT_MAX) - 处理大数计算(如ID、金额)优先考虑
GMP或BCMath扩展,而不是硬扛int
JSON解码时大整数自动转float是常见陷阱
PHP默认用json_decode()解析JSON,遇到超过PHP_INT_MAX的整数会无提示转成float,精度丢失(比如9223372036854775807变成9223372036854776000)。
- 开启
JSON_BIGINT_AS_STRING选项:json_decode($json, false, 512, JSON_BIGINT_AS_STRING) - 这样超限数字会作为字符串返回,后续可用
gmp_init()或bcadd()安全处理 - 框架如Laravel的
Request::json()默认不启用此标志,需手动配置或中间件干预
这个坑藏得深——日志里看不出异常,接口返回看着像整数,实际下游计算就偏了。上线前务必用超限值测一遍JSON路径。











