is_numeric() 判断字符串能否被隐式转为数字,对"123"、"-45.6"、"0x1a"等返回true,但它们仍是string;is_int()仅认真正integer类型,对"123"或123.0均返回false;表单验证应使用filter_var()而非is_numeric()。

is_numeric() 判断的是“能当数字用”,不是“是数字类型”
它对 "123"、"-45.6"、"0x1A"、"1e3"、甚至 " 789 " 都返回 true,但这些全是 string 类型。它甚至对布尔值 true 也返回 true(因为 true 被当作 1 解析)。这不是 bug,是设计如此:它的本职是「字符串能否被 PHP 数值上下文隐式转换」。
常见误用场景:
- 表单接收
$_GET['id']后直接is_numeric($_GET['id'])就放行——结果"123abc"过了,后续intval()变成123,但原始输入明显非法 - 用它替代类型断言,比如在 API 参数校验里写
if (!is_numeric($input)) die('not number'),却没意识到$input可能是float或int,也可能是个恶意构造的十六进制字符串 - PHP 8.1+ 中
is_numeric(NAN)和is_numeric(INF)返回false,而旧版本是true,升级后逻辑可能突然断裂
is_int() 只认真正的 integer 类型,不看内容
is_int() 是类型守门员:只对底层类型为 integer 的变量返回 true,比如 123、-42、0。它对 "123"、123.0、123.5、NULL 全部返回 false。
关键点:
-
is_int("123")→false,不是函数错了,是字符串就是字符串 -
is_int(123.0)→false,哪怕数值上等于整数,类型仍是double -
is_integer()是is_int()的完全别名,行为无差异 - 它极快,且 PHP 4+ 行为稳定,适合做类型断言(如函数返回值校验、严格模式参数检查)
要判断“是不是整数或浮点数类型”,用 is_int() || is_float()
如果你的目标是确认变量本身是原生数值类型(而非字符串),而不是“看起来像数字”,那就必须分开判断:
if (is_int($var) || is_float($var)) {
// $var 确实是 int 或 float 类型,可安全参与数学运算
}
注意:
-
is_float(123.0)返回true,is_int(123)返回true,但is_int(123.0)和is_float(123)都是false -
gettype($var)可帮你快速看清真实类型,比猜更可靠;比如gettype("123")返回"string",gettype(123)返回"integer" - 不要用
is_numeric()替代这个组合——它会把"inf"、"0xFF"、"123.0"全收进来,而你可能只想要纯整型 ID
用户输入该用 filter_var(),不是 is_numeric()
来自表单、URL、JSON 的数据,几乎全是 string。这时 is_numeric() 太松,is_int() 太严。正确做法是用 filter_var() 做验证+转换:
// 严格整数:拒绝 "123.0"、"0x1A"、"123abc"、" 123 "
$int = filter_var($_GET['id'], FILTER_VALIDATE_INT);
if ($int === false) { /* 校验失败 */ }
<p>// 浮点数:接受 "123.45"、"-2e3",但拒绝 "123."、"123abc"
$float = filter_var($_POST['price'], FILTER_VALIDATE_FLOAT);</p><p>// 可加范围限制
$age = filter_var($_POST['age'], FILTER_VALIDATE_INT, ['options' => ['min_range' => 0, 'max_range' => 120]]);</p>
要点:
-
filter_var()默认不自动 trim," 123 "会失败,需先trim() - 它返回转换后的值(如
int或float),不是布尔,避免二次转换出错 - 比
intval()+is_numeric()组合更安全:后者对"123abc"也会返回123,但filter_var()明确拒绝
真正容易被忽略的点是:类型判断和内容验证是两件事。你传进来的是字符串,就别指望 is_int() 能救你;你要求的是“合法整数输入”,就别拿 is_numeric() 当过滤器用。选错函数,漏洞就藏在看似通过的那一次判断里。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











