is_scalar只认定int、float、string、bool为true,null、array、object、resource等均返回false,空字符串、0、false等仍属标量。

is_scalar 用来快速判断一个变量是否属于「可直接参与表达式运算」的原始值类型,但它不等于“非复合类型”的直觉理解——比如 null 和 resource 明明不是数组或对象,却仍被判定为非标量。
哪些值会被 is_scalar 认定为 true
只有四类:整数(int)、浮点数(float)、字符串(string)、布尔值(bool)。其他全部返回 false。
-
is_scalar(42)→true -
is_scalar("hello")→true -
is_scalar(3.14)→true -
is_scalar(true)→true -
is_scalar(null)→false(注意:不是标量) -
is_scalar([])→false -
is_scalar(new stdClass())→false -
is_scalar(fopen('a.txt', 'r'))→false(哪怕底层是整数)
别把它当 !is_array() && !is_object() && !is_null() 用
有人误以为「只要不是数组、对象、null 就是标量」,结果踩坑。典型错误场景:
- 接收 API 参数时,用
if (!is_scalar($input)) { throw new InvalidArgumentException(); },但用户传了resource或NULL,报错逻辑看似合理,实则漏判了本该拦截的非法输入(比如意外传入未初始化的变量) - 和
is_numeric()混用:数字字符串"123"是is_numeric()为true,但也是is_scalar()为true;而"abc"是is_scalar()为true(字符串),但is_numeric()为false—— 二者语义完全不同 - 在 PHP 8+ 中配合只读类或枚举做校验时,
is_scalar对BackedEnum实例返回false(它是对象),不能替代->value的类型检查
常见误判点:空字符串、0、false 都是标量
这些值容易让人怀疑“是不是有问题”,其实完全符合定义:
立即学习“PHP免费学习笔记(深入)”;
-
is_scalar("")→true(空字符串仍是string) -
is_scalar(0)→true(整数零) -
is_scalar(false)→true(布尔假) -
is_scalar("0")→true(字符串零)
真正要警惕的是 is_scalar($x) === false 时,你面对的可能是 null、array、object、resource 或 callable —— 这些类型往往需要不同处理路径,不能一概而论为“非法”。
最常被忽略的一点:PHP 不保证未来新增类型(比如某个 RFC 提议的 enum 值类型)一定被纳入 is_scalar 范围。它只承诺当前四类,且明确排除 null 和 resource —— 写校验逻辑时,别假设它会自动覆盖所有“简单值”。



















