php 8.0+ 原生支持联合类型,如 int|float、string|null 等,用于参数、返回值和属性声明;需注意 void 和 parent/self 不可参与联合,调用前须类型判断,避免运行时错误,且应优先使用明确联合类型而非 mixed。

函数参数声明 int|float 这类多类型最常用
直接在参数名前用竖线 | 连接多个类型即可,PHP 8.0+ 原生支持,无需注释或 polyfill。
常见合法组合包括:int|float、string|null、array|object、bool|int。注意 void 不能参与联合,parent 或 self 也不能单独混入(仅限类内上下文且需配合具体语法)。
-
int|float:数值计算场景,如金额、尺寸、权重等输入 -
string|null:等价于?string,但显式写法更利于 IDE 类型推导和团队统一风格 -
array|Traversable:兼容数组与 Iterator 对象,适合通用数据遍历逻辑
返回值用 string|array 这类联合类型要小心调用路径
声明返回值为多类型后,调用方无法直接安全访问某一个类型的特有方法——比如 string|array 返回值,不能直接调用 strlen() 或 count(),因为 PHP 不知道运行时到底是哪一种。
必须先做类型判断:
functiongetData(): string|array {
return rand(0,1) ? 'ok' : ['error' => true];
}
$result = getData();
if (is_string($result)) {
echo strtoupper($result); // ✅ 安全
} elseif (is_array($result)) {
echo $result['error'] ?? 'unknown'; // ✅ 安全
}
漏掉判断就可能触发 Notice 或 Fatal Error,尤其在严格模式下(declare(strict_types=1))。
属性声明 array|object 时注意构造器赋值时机
类属性支持联合类型,但初始化必须满足至少一种类型:
class Processor {
public array|object $data;
public function __construct(array|object $data) {
$this->data = $data; // ✅ 允许传入数组或对象
}
}
如果属性未在构造器中赋值,又没设默认值,PHP 会报 TypeError(即使用了 declare(strict_types=1))。
- 不推荐写
public array|object $data = null;——null不属于array或object,非法 - 若允许为空,应声明为
public array|object|null $data;或public ?array|?object $data;(后者语法错误,?array是合法简写,但?array|?object不合法) - 正确写法是
public array|object|null $data;,或拆成两个属性/使用 getter 做惰性初始化
mixed 不等于联合类型,别滥用
mixed 是预定义类型,等价于 string|int|float|bool|array|object|null|resource,语义宽泛,IDE 和静态分析工具几乎无法提供有效提示。
能用明确联合类型就别用 mixed:
- 接收「字符串或整数」→ 用
string|int,不是mixed - 返回「数组或布尔」→ 用
array|bool,不是mixed - 只有当真不确定类型、且无法收敛时才考虑
mixed,并配以文档说明
联合类型不是越多越好,超过 3 种类型(如 string|int|float|array|null)往往意味着业务逻辑耦合过重,该拆函数了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











