(int)强制转换最常用但会截断小数、非数字开头返回0;intval()支持进制指定但有溢出风险;filter_var(..., FILTER_VALIDATE_INT)严格校验整数字符串并支持范围限制。

直接用 (int) 强制转换最常用,但要注意截断逻辑
PHP 里把字符串转整数,(int) 是最直觉的做法,比如 (int)"123" 得到 123,(int)"45.99" 得到 45。它不是四舍五入,而是向零截断(truncation),小数点后全丢;遇到非数字开头的字符串(如 "abc123"),结果直接是 0。
常见踩坑点:
-
(int)"0xff"不会解析十六进制,结果是0(想解析需用hexdec()) -
(int)" 42 "会自动 trim 空格,得到42;但(int)"42px"会停在p,只取前面42 -
(int)""或(int)" "都得0,无法区分空串和真零
用 intval() 更可控,能指定进制和处理边界
intval() 和 (int) 行为基本一致,但它多一个可选参数 $base,支持按进制解析:比如 intval("1010", 2) 返回 10,intval("ff", 16) 返回 255。
注意几个关键细节:
立即学习“PHP免费学习笔记(深入)”;
- 如果字符串开头有空格或
+/-,intval()会跳过并继续解析(和(int)一样) - 若指定了
$base(比如2或16),函数会严格按该进制读取,遇到非法字符就停;不指定则默认十进制 -
intval("99999999999999999999", 10)在 32 位系统上可能溢出变2147483647(PHP_INT_MAX),64 位下才安全
用 filter_var() 做安全校验式转换
当你要确保输入“确实是合法整数字符串”,而不是容忍模糊匹配时,filter_var() 更合适。它不会尝试截取前缀数字,而是整体验证:
-
filter_var("123", FILTER_VALIDATE_INT)→123 -
filter_var("123abc", FILTER_VALIDATE_INT)→false -
filter_var(" -42 ", FILTER_VALIDATE_INT)→-42(允许首尾空白) -
filter_var("12.3", FILTER_VALIDATE_INT)→false(小数点不行)
它还能加选项限制范围,比如 filter_var("200", FILTER_VALIDATE_INT, ["options" => ["min_range" => 0, "max_range" => 100]]) 会返回 false。
别用 settype() 或 strval() 混淆类型
settype($var, "int") 虽然也能转,但它会修改原变量,且行为和 (int) 完全一致,没额外好处;而 strval() 是反方向的(转字符串),名字容易看错。
更隐蔽的坑是误用 is_numeric():它返回 true 对于 "1e4"、"+42"、"0x1A" 这类,但这些转成整数时结果不稳定((int)"1e4" 是 1,不是 10000)——所以不能靠 is_numeric() 判断是否适合转整数。
真正要严谨处理用户输入时,优先选 filter_var(..., FILTER_VALIDATE_INT);快速脚本或内部数据用 (int) 或 intval() 就行,但得清楚它们对异常输入的静默容忍策略。



















