is_scalar只将整型、浮点型、字符串和布尔型判定为标量,返回true;null、数组、对象、资源等均返回false,且自php 4.0.5起规则未变。

is_scalar 是 PHP 里一个判断变量是否为「标量」的内置函数,返回 true 或 false。它不等于“是不是基本类型”,也不等价于“是不是简单值”——它的判定规则非常具体,且容易误用。
哪些值会被 is_scalar 认作标量?
只有这四类:整型(int)、浮点型(float)、字符串(string)、布尔型(bool)。其他一律否决:
-
NULL→false(哪怕它常被当作“空基础值”,但 PHP 明确排除) - 数组(
array)→false - 对象(
object)→false - 资源(
resource)→false(即使底层是整数,也不算) - 可调用(
callable)→false - 闭包(
Closure)→false
示例:
var_dump(is_scalar(42)); // true
var_dump(is_scalar("hello")); // true
var_dump(is_scalar(true)); // true
var_dump(is_scalar(null)); // false
var_dump(is_scalar([])); // false
var_dump(is_scalar(new stdClass())); // false
is_scalar 和 is_numeric、is_string 等函数的区别在哪?
关键在抽象层级:is_scalar 是“类型集合判断”,而 is_string 这类是“单一类型精确判断”。它们不是替代关系,而是不同用途:
-
is_numeric("123")→true(字符串内容可转数字),但is_scalar("123")也 →true(因为它是字符串) -
is_numeric("abc")→false,is_scalar("abc")→true(仍是字符串) -
is_int(42)→true,但is_int("42")→false;而is_scalar("42")→true
所以别用 is_scalar 替代参数合法性校验——它不检查语义,只看语言定义的标量范畴。
为什么你可能在接口校验里误用 is_scalar?
常见错误是拿它当“非结构化数据兜底判断”:
- 想确认传入的是“能直接 echo 的值”,结果
is_scalar(STDOUT)返回false(STDOUT是 resource),但代码仍继续执行并报错 - 做 JSON API 参数过滤时,用
if (!is_scalar($input)) { throw ... },却漏掉NULL和空数组——它们都过不了关,但你本意可能是“拒绝对象/资源”,而非拒绝NULL - PHP 8.7 新增了
is_scalar_type()(支持联合类型如string|null),但is_scalar本身没变,仍不认NULL
真正安全的组合通常是:is_scalar($x) || is_null($x),或更明确地逐个判断 is_string($x) || is_int($x) || is_float($x) || is_bool($x) || is_null($x)。
最易被忽略的一点:它的行为从 PHP 4.0.5 定义至今未变,但正因为太稳定,很多人会下意识认为它“覆盖所有基础值”,而忘了 NULL 和 resource 的硬性排除。用之前,先问自己——你要拦的是“结构体”,还是“所有非字符串/数字/布尔的东西”?答案不同,选的函数就该不同。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











