php 8联合类型用|分隔多个明确类型,支持string|int|null等组合,但禁止void、mixed等无效类型,且null必须显式声明。

PHP 8 引入的联合类型(Union Types)让函数参数、返回值和属性的类型声明更灵活、更贴近实际业务场景,尤其适合处理“可能有多种类型”的复杂参数。关键在于:联合类型不是万能兜底,而要配合可空性、字面量类型、类名与内置类型合理组合,并注意与 PHP 7.4+ 类型系统的兼容逻辑。
基础写法:用竖线 | 连接多个类型
联合类型用 | 分隔多个允许的类型,所有类型都必须是明确、可静态分析的(不能是变量或表达式)。常见组合包括:
-
内置类型 + 内置类型:如
string|int|float表示接受字符串、整数或浮点数 -
类名 + null:如
User|null替代旧版?User(二者等价,但联合类型更统一) -
字面量类型 + 类型:如
'admin'|'editor'|Role,适用于角色标识混合对象场景 -
数组变体:如
array|string或更精确的int[]|string[](PHP 8.1+ 支持泛型式数组语法)
处理“复杂参数”:嵌套结构与可选组合
当参数本身是数组或对象,且内部字段类型不固定时,联合类型需分层设计。例如接收一个用户配置,可能是关联数组、JSON 字符串或预构建的 Config 对象:
- 声明为:
array|string|Config - 函数内需主动判断类型并标准化:
match或gettype()+is_array()等做分支处理 - 避免直接对
array|string调用数组函数——先is_array()检查再操作 - 若含
null,建议显式写成array|string|Config|null,而非依赖默认值,提升可读性
避坑要点:联合类型不支持的写法
联合类型看似自由,但有明确限制,误用会导致解析失败或运行时错误:
-
不能包含
void、callable或mixed(mixed本身已表示任意类型,无需联合) -
不能与传统伪类型混用:如
resource|array在严格模式下会报错(resource不是独立类型,应改用StreamInterface|array等抽象) -
不能省略
null的显式声明:string|int不代表可为空,要接受null必须写成string|int|null -
与默认参数共存时,类型必须覆盖默认值:如
function foo(string|int $x = 'default') { ... }合法;但function foo(int $x = 'default')会触发 TypeError
进阶技巧:结合属性类型与构造器参数
在类定义中,联合类型同样适用,尤其适合封装不确定输入的 DTO 或 Builder:
- 属性声明:
public string|int|null $id; - 构造器参数:
public function __construct(public array|string $config) {} - 搭配
#[\Override](PHP 8.2+)或类型断言,在 setter 中做二次校验,例如:if (!is_string($value) && !is_int($value)) throw new InvalidArgumentException(...); - IDE 和静态分析工具(如 PHPStan)能据此推导更准的类型流,减少运行时
TypeError
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











