PHP标量类型仅有bool、int、float、string四种,因其均为不可再分的单个原子值;array、object、null、resource等因具结构、可拆解或语义为“无值”,故不属于标量。

PHP标量类型只有四种:bool、int、float、string。其他如 array、object、null、resource 都不属于标量。
为什么只有这四种才算标量?
标量(scalar)在 PHP 中的定义非常严格:它必须是「不可再分的单个值」,不能包含子元素或结构。这意味着:
-
bool只能是true或false—— 没有内部结构 -
int是整数,比如42、-1024、0x1F、0755—— 所有形式都算一个原子值 -
float是浮点数,包括3.14、2E5、-0.001—— 即使带指数,仍是单值 -
string是字符序列,哪怕长度为 0("")或含变量插值("hello $name"),也视为一个标量单位 -
null不是标量 —— 它是特殊类型,语义上表示“无值”,且gettype(null)返回"NULL",不是"scalar"
常见误判:array 和 object 为什么不算?
因为它们可拆解、可遍历、可嵌套:
-
array至少有一个键值对,count($arr)可能 > 1,foreach能逐项访问 -
object有属性和方法,get_object_vars()能导出为数组,serialize()输出结构化字符串 - 即使空数组
[]或新实例new StdClass(),其本质仍是复合容器,不是原子值
类型检测时容易踩的坑
用内置函数判断标量要小心边界情况:
立即学习“PHP免费学习笔记(深入)”;
-
is_scalar($v)对null返回false—— 这是正确行为,但常被忽略 -
gettype($v)返回字符串,比如"boolean"、"integer",但不会返回"scalar" -
is_int($v)、is_string($v)等只能测具体类型,不能替代标量总判别 - 注意字符串数字:
"123"是string(标量),但(int)"123"后变成int(仍是标量)—— 类型转换不改变标量属性
真正需要区分标量和非标量的场景,比如序列化过滤、递归遍历终止条件、或写泛型工具函数时,必须严格按这四种判断。多一个 array、少一个 float,都会导致逻辑分支错位。



















