最常用的是(int)强制转换,但会静默截断小数和非法字符;intval()支持进制转换但校验能力相同;真正校验合法性必须用filter_var($str, filter_validate_int),它能区分合法整数与含非法字符的字符串。

直接用 (int) 强制转换最常用,但会静默截断小数和非法字符
PHP 里把字符串变成整数,(int) 是最顺手的方式,比如 (int)"123" 得到 123,(int)"45.99" 得到 45。但它不校验合法性——(int)"123abc" 也是 123,(int)"abc123" 却是 0。这种“尽力而为”的行为在表单处理或日志解析时容易埋雷。
- 只适合你**完全信任输入格式**的场景,比如已知是纯数字字符串或简单整数字符串
- 遇到空格开头(如
" 42")能自动跳过,但"42 "后面有空格也不影响结果 - 遇到科学计数法字符串(如
"1e3")会被转成1,不是预期的1000
intval() 可指定进制,但默认仍是十进制且同样忽略尾部非法字符
intval() 和 (int) 行为高度一致,区别主要在可选参数:intval("101", 2) 能按二进制解析得 5,intval("FF", 16) 得 255。但如果不传第二个参数,它和 (int) 几乎没差别,照样对 "123px" 返回 123,对 "px123" 返回 0。
- 需要处理十六进制、八进制等非十进制字符串时才值得用第二个参数
- 不要指望它比
(int)更“严格”——它不做范围检查,也不报错 - 注意
intval(null)返回0,intval("")也是0,这点容易和空值判断逻辑冲突
要真正校验合法性,必须用 filter_var($str, FILTER_VALIDATE_INT)
当你需要确认一个字符串“确实是整数”,而不是“尽量凑一个整数出来”,就得换思路。filter_var() 是唯一能区分 "123"(合法)和 "123abc"(非法)的标准方式。它返回 false 而不是静默处理,配合类型检查很可靠。
本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
-
filter_var("123", FILTER_VALIDATE_INT)→123(整数类型) -
filter_var("123abc", FILTER_VALIDATE_INT)→false - 支持选项如
["min_range" => 1, "max_range" => 100],适合表单字段范围校验 - 注意它不接受带逗号的数字(如
"1,000")、不接受前导零("0123"被判无效,除非显式设FLAG_ALLOW_OCTAL)
别用 settype($str, 'int'),它会修改原变量且语义模糊
settype() 确实能把字符串变整数,但它直接改原变量,还返回布尔值表示是否成功,容易让人误以为它更“安全”。实际上它的转换规则和 (int) 完全一样,该截断的照截,该归零的照归,只是多了一次赋值副作用。
立即学习“PHP免费学习笔记(深入)”;
- 几乎找不到非用它不可的场景;现代代码里基本被当成反模式
- 如果写成
settype($input, 'int'); echo $input;,看着像校验,其实只是又做了一遍静默转换 - 和
intval()混用时尤其危险:比如$x = "123abc"; settype($x, 'int'); intval($x)还是123,毫无新信息
真正难的不是选哪个函数,而是想清楚:你要的是“取整数部分”,还是“确认这是合法整数”。前者用 (int) 或 intval() 就行;后者必须上 filter_var() 并检查返回值类型。很多人卡在中间状态——既没做校验,又没意识到静默转换已经悄悄改了数据。










