php 8.0+ 的联合类型仅支持函数参数、返回值和静态变量声明,不适用于类属性、常量、局部变量及 catch 块;内置函数无联合类型声明机制。

PHP 8.0+ 不提供“内置函数”的联合类型声明方式——这是关键前提。PHP 的联合类型(Union Types)是开发者用于自定义函数、方法、静态变量的语法特性,不是 PHP 内置函数(如 strlen()、array_merge()、json_encode() 等)所采用的声明机制。所有内置函数的签名由 Zend 引擎硬编码实现,不使用 | 语法声明联合类型,也不支持运行时联合类型校验。
你真正能用联合类型的,只有三处:
- ✅ 函数/方法的参数声明
- ✅ 函数/方法的返回值声明
- ✅ 静态变量的类型声明(PHP 8.0+ 完全支持)
而以下位置明确不支持,写即报错:
- ❌ 类属性(
public int|string $id;→ParseError) - ❌
const常量类型声明 - ❌
global变量或普通局部变量(如$x: string|int;无效) - ❌
catch块的异常类型(仍只支持单个类名,如catch (InvalidArgumentException | RuntimeException $e)是语法糖,非联合类型)
参数声明:最常用且强制校验
直接在形参后写 type1|type2,调用时传入任一匹配类型即可,否则立即抛出 TypeError:
function parseId(int|string $input): string {
return is_int($input) ? (string)$input : $input;
}
parseId(42); // ✅
parseId("abc"); // ✅
parseId([]); // ❌ TypeError
注意:默认值不影响类型检查,
string|array $data = []中,即使传空数组,$data仍必须满足string|array;省略参数时也需符合该约束。
返回值声明:校验发生在每个 return 执行瞬间
签名中写 int|float|null,每次 return 表达式的值都必须属于其中一种:
function getScore(?int $raw): int|float|null {
if ($raw === null) return null;
if ($raw <blockquote><p>⚠️ 若某条 <code>return</code> 返回了 <code>bool</code> 或 <code>object</code>,运行时报 <code>TypeError</code>,<strong>不是函数退出时统一检查</strong>。</p></blockquote><hr><h3>静态变量声明:首次赋值锁定类型分支</h3><p>仅限 <code>static</code> 变量,初始化值必须至少匹配联合类型中的一个分支:</p><pre class="brush:php;toolbar:false;">function counter(): int {
static int|string $count = 0; // ✅ 0 匹配 int
$count++;
return (int)$count;
}? 关键规则:
$count = 'done';后续再调用时,若尝试$count = [];就会报错——类型在首次执行后锁定,后续赋值必须持续满足该联合类型。
特别提醒:这些「看起来像」但实际不是联合类型的写法
-
mixed:是独立顶层类型,不可参与|连接(string|mixed→ 语法错误) -
void:禁止出现在任何联合类型中(int|void无效) -
null单独出现:null不能作为唯一类型(function f(): null合法,但null|int合法,null单独作联合类型无意义) -
?Type:是null|Type的等价简写,二者语义完全一致,可互换使用
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











