判断正整数应使用filter_var($input, filter_validate_int, ['options' => ['min_range' => 1]]) !== false;is_int()只判类型不判值,ctype_digit()不支持符号/空格/unicode且0也返回true,强转(int)会静默截断导致误判。

用 is_int() 判断类型不等于判断“正整数”
很多人以为 is_int(5) 返回 true 就代表是正整数,其实它只管类型,不管值——is_int(-3) 也是 true,但 -3 显然不是正整数。
更隐蔽的坑是字符串数字:is_int("123") 是 false,但用户输入几乎全是字符串,直接上 is_int() 基本白忙。
- 先确认变量是否为整型且非字符串:用
is_int($var)+$var > 0组合 - 若来源是表单或 JSON(即字符串),必须先转换再验:优先用
filter_var($var, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]) - 避免用
(int)$var强转后比较,因为(int)"123abc"变成123,静默截断导致误判
filter_var() 验证正整数最稳,但参数不能漏
这是 PHP 官方推荐路径,关键在 FILTER_VALIDATE_INT 必须配 min_range,否则默认允许负数和零。
- 验证成功返回 int 类型值;失败返回
false(不是 null 或 0) - 必须显式传
['options' => ['min_range' => 1]],漏掉min_range就等同于只验“是不是整数”,不是“是不是正整数” - 它会自动拒绝带空格或单位的字符串,比如
" 42 "或"100px"都过不了 - 注意:
filter_var("1.5", FILTER_VALIDATE_INT)返回false,符合预期;但filter_var(1.5, FILTER_VALIDATE_INT)也返回false(浮点数类型不匹配)
别用 ctype_digit() 验字符串数字,除非你确定没符号
ctype_digit() 看起来快,但它只接受纯数字字符串,连 "-5" 或 "+10" 都直接挂,更别说 " 7 " 这种带空格的。它本质是“检查是否全由 0–9 构成”,不是“检查是否为正整数”。
- 仅适用于你已知输入是字符串、且绝对无符号/空格/小数点的场景(比如从某固定 API 拿到的 ID 字段)
-
ctype_digit("0")返回true,但 0 不是正整数,得额外加!=="0"判断 - 遇到 Unicode 数字(如全角数字)会失败,
ctype_digit("123")是false - 安全替代方案:先
trim()再filter_var(),比拼一堆ctype_*+ 正则更可靠
边界情况:0、空字符串、null、浮点数怎么归类
真实业务里这些值常混在一起,但它们对“正整数”的判定结果完全不同,必须分清。
立即学习“PHP免费学习笔记(深入)”;
-
0→ 不是正整数(正整数定义:大于 0 的整数) -
""或null→filter_var()返回false;is_int()直接 false;别用empty()替代验证,因为0也会被当成 empty -
1.0→ 类型是 float,is_int(1.0)是false;但filter_var(1.0, FILTER_VALIDATE_INT, ['options'=>['min_range'=>1]])是false(类型不匹配) -
"0"→ 字符串,filter_var("0", ...)因min_range=>1失败;ctype_digit("0")成功但语义错误,需额外排除
filter_var($input, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]) !== false。最易错的是忘记 min_range 参数,或者把字符串和数字混着喂给 is_int()。











