联合类型仅支持在函数参数、返回值和 public/protected 类属性中使用,不支持局部变量或 private 属性;语法为 A|B|C,PHP 8.0 中 private 属性声明会报错,PHP 8.1+ 才支持 protected/public 属性。

PHP 8.0 不支持直接用联合类型声明普通变量(如 $x: int|string;),这是常见误解。联合类型仅允许在函数参数、返回值和类属性(仅限 public 和 protected)中使用,不能用于局部变量或 private 属性。
哪些地方能用联合类型?
联合类型语法 A|B|C 只在以下三处合法:
-
函数参数:例如
function foo(int|string $id) { ... } -
函数返回值:例如
function getId(): int|string|null { ... } -
类的 public/protected 属性:例如
public int|string $status;(PHP 8.1+ 支持;PHP 8.0 中 private 属性仍不支持,会报错)
为什么不能声明局部变量?
PHP 是动态语言,变量生命周期短、作用域小,运行时类型可变。联合类型设计目标是增强接口契约(函数签名)和结构契约(类公开状态)的可读性与安全性,而非约束临时变量。试图写 $value: string|float = "1.5"; 会触发解析错误:Parse error: syntax error。
替代方案:用文档注释 + IDE 提示
若需提示局部变量可能的类型,可用 PHPDoc 注释模拟:
立即学习“PHP免费学习笔记(深入)”;
/** @var int|string $userId */ $userId = $_GET['id'] ?? 'guest';
主流 IDE(PhpStorm、VS Code + Intelephense)和静态分析工具(PHPStan、Psalm)能识别该注释,提供补全与类型检查,效果接近原生联合类型。
注意 null 的显式声明
如果变量可能为 null,必须写进联合类型,不能依赖默认值或隐式行为:
- ✅ 正确:
function findUser(int $id): User|null - ❌ 错误:
function findUser(int $id): User却返回null→ 运行时报Fatal error: Uncaught TypeError
可空简写 ?Type 等价于 Type|null,两者语义完全一致,任选其一即可。



















