
用 is_int() + >= 0 判断最可靠
PHP 中没有内置的「非负整数」类型检查函数,is_int() 只能确认是否为整型,但不保证值 ≥ 0;直接用 ctype_digit() 又只接受字符串,且会把 "0" 当合法、"-5" 直接报错(因为含负号)。所以稳妥做法是先确保是整型,再判断范围。
-
is_int($var)必须为 true —— 排除"123"、123.0、null、false等伪整数值 - 再加
$var >= 0—— 防止-1、-0(虽然-0 === 0,但显式写更清晰) - 别用
filter_var($var, FILTER_VALIDATE_INT, ['options' => ['min_range' => 0]]):它对浮点数如123.0返回 false,但对字符串"123"却返回123(即转成了 int),行为不一致
ctype_digit() 只适用于字符串输入场景
如果你确定变量是字符串(比如来自 $_GET 或 $_POST),ctype_digit() 是最快、最安全的选择,它严格要求纯数字字符、非空、不带符号、不带空格。
-
ctype_digit("0")→ true(自然数包含 0) -
ctype_digit("123")→ true -
ctype_digit("-5")→ false(含负号) -
ctype_digit("12.3")→ false(含小数点) -
ctype_digit("")→ false(空字符串) - ⚠️ 注意:
ctype_digit(123)会触发 warning,因为它只接受 string 类型参数
别踩 intval() 和 (int) 强转的坑
很多人习惯先强转再比较,比如 (int)$var === $var && $var >= 0,但这在边界情况会出错。
-
(int)"123abc"→123,导致误判为合法 -
(int)[]→0,空数组被当成 0 -
(int)null→0,null 也被当成 0 -
(int)true→1,布尔值干扰判断 - 真正想验证的是「原始值本身」,不是「它转成 int 后像不像」
实际校验建议:按来源分策略
不同来源的数据,验证逻辑应不同。硬套一个函数反而容易漏判或误判。
立即学习“PHP免费学习笔记(深入)”;
- 来自 API 请求体或表单提交(字符串)→ 优先用
ctype_digit($str) - 来自数据库查询结果(可能为 int/NULL)→ 先
is_int($val) && $val >= 0,再考虑!is_null($val) - 来自函数返回值(不确定类型)→ 加一层
gettype($val) === 'integer'比is_int()更明确(效果相同,但意图更直白) - 需要同时兼容字符串和整数?写个封装函数,内部先
is_int(),否则再is_string() && ctype_digit()
最麻烦的地方往往不在判断逻辑本身,而在你没意识到输入可能是 null、空数组、对象,或者前端传了带空格的字符串比如 " 123 " —— 这些都得在 ctype_digit() 前 trim 或提前拦截。










