is_int()仅对PHP原生整型返回true,不转换类型;is_numeric()解析字符串是否可转为数字,支持科学计数法等;is_integer()是is_int()的完全别名;整数校验应优先用filter_var(..., FILTER_VALIDATE_INT)。

is_int()只认真正的整型变量
is_int() 是类型严格检查函数,它只对 PHP 内部类型为 integer 的值返回 true。哪怕看起来是整数,只要不是原生整型,一律失败:
-
is_int(42)→true -
is_int('42')→false(字符串) -
is_int(42.0)→false(浮点数,即使值为整数) -
is_int(null),is_int(true),is_int([])→ 全部false
它不进行任何类型转换,也不解析内容,纯粹看 zval 的 type 字段是否为 IS_LONG。适合用在你明确知道数据来源是整型变量、且不允许隐式转换的场景,比如函数参数校验或数组键类型断言。
is_numeric()接受数字字符串和科学计数法
is_numeric() 是内容解析型判断,只要字符串能被 PHP 解析成数字(包括整数、浮点数、十六进制、科学计数法),就返回 true:
-
is_numeric('42')→true -
is_numeric('42.5')→true -
is_numeric('0x2A')→true(十六进制) -
is_numeric('1e3')→true(科学计数法) -
is_numeric(' 42 ')→true(允许首尾空白) -
is_numeric('42abc')→false(但'42 '是true)
它会触发字符串到数字的内部转换逻辑,性能略低于 is_int(),且存在绕过风险——比如用户传入 '0x1F' 或 '1e999999999' 可能被误判为合法数字,后续 intval() 转换后却变成 0 或 INF。
别名 is_integer() 和 is_numeric() 的常见误用
is_integer() 就是 is_int() 的完全别名,二者行为 100% 一致,无任何差异。不要因为名字带 “integer” 就以为它比 is_int() 更“宽松”或更“严格”——它只是个同义词。
而很多人误以为 is_numeric() 能替代 is_int() 做整数校验,结果埋下隐患:
- 表单提交
$_GET['id'] = '123.0'→is_numeric()返回true,但(int)$id会截断成123,而floatval($id)是123.0,语义已丢失 - 数据库主键必须是整型,用
is_numeric()放行'0x7B',查不到记录还难排查 - 配合
filter_var($v, FILTER_VALIDATE_INT)才能真正做安全整数校验,它支持范围、进制、严格模式
什么时候该用哪个函数
选函数不是看“哪个更像整数”,而是看你要解决什么问题:
- 验证一个变量是否「本来就是整型」(如函数参数、数组索引、
count()返回值)→ 用is_int() - 验证用户输入是否「可解释为数字」(如金额、页码、搜索关键词含数字)→ 用
is_numeric(),但后续必须用filter_var(..., FILTER_VALIDATE_INT)或ctype_digit()+strlen()做二次过滤 - 需要同时拒绝负数、小数、空格、前导零 →
ctype_digit()更合适(但它只接受纯 ASCII 数字字符串,不支持负号)
最常被忽略的一点:PHP 中 is_numeric('') 返回 false,但 is_numeric('0') 和 is_numeric('00') 都是 true;而 ctype_digit('00') 是 true,ctype_digit('0') 也是 true,但 ctype_digit('-1') 直接挂掉——这些边界行为不手动测一遍,上线后容易出错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











