PHP 8.0+联合类型仅适用于自定义函数(参数、返回值、静态变量),不支持内置函数、类属性、常量或全局变量;null需显式声明,不可用mixed等替代。

PHP 8.0+ 的联合类型不能用于内置函数(如 strlen()、array_merge() 等)的声明 —— 因为内置函数由 Zend 引擎用 C 实现,其签名在编译时已固定,不支持 PHP 层面的类型语法修改。
联合类型只适用于你写的函数
你只能在自己定义的函数(包括普通函数、方法、闭包)中使用 | 声明联合类型:
- ✅ 允许:函数参数、返回值、静态变量
-
❌ 不允许:内置函数、类属性(
public int|string $id;会报ParseError)、常量、全局变量
如何正确声明你自己的函数(含联合类型)
写法必须符合三处合法位置,并注意 null 的显式性:
- 参数:例如
function logValue(string|int|float|null $data): void - 返回值:例如
function getConfig(): array|string|false - 静态变量(较少用):例如
static string|int $cache = 'default';
注意:null 必须写出来,?string 是语法糖,等价于 string|null,但两者都合法;而 void、mixed、never 等不能出现在联合类型中。
立即学习“PHP免费学习笔记(深入)”;
想“模拟”内置函数带联合类型?用封装代替
如果你希望调用类似 json_decode() 这样可能返回 array|object|null 的行为,又想加类型提示,就封装一层:
function safeJsonDecode(string $json): array|object|null
{
return json_decode($json, flags: JSON_THROW_ON_ERROR) ?: null;
}
这样 IDE 和静态分析工具(如 PHPStan)就能识别返回类型,而原始 json_decode() 本身无法改写。
别踩这些常见坑
- 试图给
function_exists()加联合类型注解 → 无效,它不是你定义的函数 - 在类属性写
private int|string $id;→ 解析失败,PHP 8.0+ 仍不支持 - 用
mixed替代联合类型 → 违背类型安全初衷,应明确列出实际可能类型 - 把
callable|array当作万能兜底 → 要确保业务逻辑真能处理这两种类型的所有分支



















