PHP 8.0中null必须显式声明为string|null或int|null等联合形式,不可隐式推断;?string是语法糖且仅适用于单一类型,联合类型中?失效,正确写法只能是string|int|null。

string|null、int|null 这种形式,不能靠隐式推断。
PHP 8.0 的联合类型不把 null 当作“默认可选”——它只认你亲手敲进去的 |null。漏掉就报 TypeError,哪怕启用了 strict_types=1 也拦不住这个错误。
为什么 ?string 和 string|null 看似等价却有区别?
?string 是语法糖,仅在**单一类型前缀**时有效;一旦进入联合类型,? 就失效了。
-
?string✅ 合法(等价于string|null) -
?string|int❌ 解析失败:PHP 不允许?和|混用 -
string|int|null✅ 唯一正确写法
所以当你需要“字符串或整数或空值”时,只能写 string|int|null,不能偷懒写 ?string|int。
null 在联合类型中不是“特殊公民”,而是普通成员
PHP 把 null 当作一个独立类型参与联合判断,和其他类型地位完全平等:
- 顺序无关:
string|null和null|string效果一样 - 运行时检查严格:传入
null时,只有声明里含|null才放行 - IDE 和静态分析(如 PHPStan)依赖这个显式声明做推断,漏写
|null就会标红警告
示例:
立即学习“PHP免费学习笔记(深入)”;
function handleId(int|string|null $id): void { ... }
这个函数接受 123、"abc" 或 null;但如果调用 handleId([]),立刻抛出 TypeError。
容易踩的坑:联合类型 + null 的三个典型错误
常见错误现象包括:
- 函数参数声明为
int|string,但调用方传了null→ 直接Fatal error: Uncaught TypeError - 类属性声明为
public array $data;,实际从数据库读到NULL→ 属性赋值失败(PHP 8.0+ 强制类型验证) - 返回类型写成
array,但逻辑中可能 returnnull→ 调用方拿到null后调foreach就崩
修复方式统一:检查所有可能为 null 的位置,把 |null 加进类型声明里,再在函数体内用 === null 显式分支处理。
|null,又没配好 PHPStan 级别,等上线后才在某个边缘路径触发空值崩溃。这种问题不会出现在单元测试里,只会在凌晨三点的报警里出现。



















