php 的可空类型(nullable type)是自 php 7.1 起引入的语法特性,用于明确表示某个参数、返回值或类属性可以接受 null 值,同时仍保持类型约束,其写法为 ?type,等价于 type|null,适用于参数、返回值(php 7.1+)和属性(php 7.4+),需显式初始化或设默认值 null,且不支持复合类型如 ?array|string。

PHP 的可空类型(Nullable Type)是自 PHP 7.1 起引入的语法特性,用于明确表示某个参数、返回值或类属性可以接受 null 值,同时仍保持类型约束。它的核心是 ?Type 写法,不是运算符,而是类型声明的一部分。
可空类型的基本写法
在类型名前加一个英文问号 ?,中间不能有空格:
?string // ✅ 合法:字符串或 null ?int // ✅ 合法:整数或 null ?array // ✅ 合法:数组或 null ?Logger // ✅ 合法:Logger 实例或 null ?void // ❌ 非法:void 本身不允许有值,不可为空
它等价于联合类型 Type|null(PHP 8.0+ 中二者语义完全一致),但 ?Type 更简洁、更聚焦“可空”语义。
可空类型适用的位置
只允许出现在以下三类声明中:
- 函数/方法参数(PHP 7.1+ 支持)
- 函数/方法返回值(PHP 7.1+ 支持)
- 类属性(PHP 7.4+ 才支持,且需启用属性类型声明)
示例:
<?php declare(strict_types=1);
class UserService {
private ?string $cacheKey = null; // ✅ PHP 7.4+ 属性可空
public function find(int $id): ?array // ✅ 返回值可空
{
return $id > 0 ? ['id' => $id, 'name' => 'Alice'] : null;
}
public function setLogger(?Logger $logger = null) // ✅ 参数可空,默认值为 null
{
$this->logger = $logger;
}
}
⚠️ 注意:
- 若参数声明为
?Type,必须提供默认值= null,否则调用时不传参会报错(除非显式传null)。 - 属性声明为
?Type时,必须初始化为null或对应类型值(如private ?string $name = null;)。
可空类型的运行时行为
启用 strict_types=1 后,类型检查严格生效:
- 传入
null→ ✅ 允许 - 传入正确类型值(如
?string传"hello")→ ✅ 允许 - 传入错误类型(如
?int传"123"或[])→ ❌TypeError - 传入
null给非可空类型(如string $s)→ ❌TypeError
function greet(?string $name): string {
return $name ?? 'Guest';
}
greet('Tom'); // ✅
greet(null); // ✅
greet(42); // ❌ TypeError: Argument 1 must be of type string|null
常见误区与限制
-
?array|string是非法写法 ——?只能修饰单个类型,不能用于联合类型左侧;正确写法是array|string|null(PHP 8.0+)或?array(仅表示 array 或 null)。 -
??string、string?、? ?string等写法均无效 —— PHP 不支持后置问号或嵌套可空。 -
?mixed在 PHP 8.0+ 已被弃用,因为mixed本身就隐含可为null。 - 不可用于数组键、动态属性、变量类型注解(如
/** @var ?int */),这些不参与运行时类型检查。
与联合类型的配合(PHP 8.0+)
PHP 8.0 引入了原生联合类型(A|B|C),此时 ?Type 和 Type|null 完全等价:
function process(?int $id): ?string { ... } // 清晰简洁
function process(int|null $id): string|null { ... } // 语义等价,适合复杂场景
function handle(int|string|null $data): void { ... } // 联合类型更直观
建议:
- 简单可空用
?Type(高频参数/返回值) - 多类型 + null 用
A|B|null(如int|string|null)
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











