PHP 8.0联合类型是解决真实开发痛点的实用工具,支持int|null、string|int等显式声明,实现IDE识别、运行时校验、null安全处理及多态输入统一,替代mixed提升类型精度与静态分析能力。

PHP 8.0 的联合类型(Union Types)不是炫技功能,而是解决真实开发痛点的实用工具。它让“这个参数可能是 A,也可能是 B”这种常见逻辑,从靠注释和运行时判断,变成可被 IDE 识别、被 PHP 运行时校验的显式契约。
处理数据库查询结果中可能为 null 的字段
ORM 或原生查询返回的字段常存在空值,比如用户年龄、手机号、头像 URL。过去常用 ?int 或注释说明,现在可直接用 int|null 或 string|null 明确表达语义:
- 类属性声明更直观:
public int|null $age;比/** @var int|null */ public $age;更干净,且支持属性赋值时的类型检查 - 函数入参可强制约束:
function updateUserAge(int $userId, int|null $newAge): void,传入array或bool会直接报TypeError - 返回值声明提升调用方安全性:
function findPhoneByUserId(int $id): string|null,调用者必须考虑null分支,避免未判空就调用strlen()等方法
兼容新旧数据格式或 API 版本过渡
系统升级时,接口字段类型可能变化(如旧版返回字符串 ID,新版改用整数 ID),或历史数据混存多种格式。联合类型能优雅承载这种不确定性:
-
function processOrderId(string|int $id): Order—— 支持两种 ID 格式,内部用is_int()或is_string()做类型收窄后分别处理 -
function parseConfig(array|stdClass $config): array—— 接受原始数组或 JSON 解码后的对象,统一转为标准数组结构 - 避免写两套函数或用
mixed放弃类型安全,既保留灵活性,又守住底线
定义多态输入的工具函数
工具类方法常需适配不同来源的数据:表单提交(string)、API 参数(int)、缓存反序列化(float)。联合类型让一个函数覆盖全部场景:
立即学习“PHP免费学习笔记(深入)”;
-
function normalizeScore(int|float|string $raw): float—— 内部统一转为 float,无需外部反复(float)强转 -
function formatName(string|User $input): string—— 支持传入用户名字符串,也支持传入User对象自动取名,增强复用性 - IDE 能基于联合类型提示所有合法入参形式,减少误用
替代模糊的 mixed,缩小类型范围
mixed 虽灵活但等于放弃类型约束。当实际可接受的类型只有几种时,联合类型是更优选择:
- 错误响应中常见的
string|array:比如日志记录函数logError(string|array $message),比mixed更具描述性 - 配置项允许的取值:
function setCacheTTL(int|float|string $ttl),支持秒数、时间字符串(如"1h")或浮点精度 - 静态分析工具(如 PHPStan)能据此推导出更精确的执行路径,发现潜在逻辑漏洞



















