php 7.1起支持可空类型,语法为?加类型名(如?string),用于参数和返回值,表示明确允许null且不触发类型错误;不可在问号后加空格,不支持类属性和void,非严格模式下仍需显式声明。

PHP可空类型语法是问号加类型声明
PHP 7.1 起支持可空类型(Nullable Types),写法就是在类型前加一个 ?,比如 ?string、?int、?array。它不是“类型联合”,也不是“默认 null”,而是明确告诉 PHP:这个参数/返回值允许传入 null,且不触发类型错误。
函数参数和返回值都支持,但写法位置不同
参数的可空类型写在类型名前;返回值的可空类型也写在类型名前,但必须紧挨着冒号,中间不能有空格。
常见错误现象:function foo(?string $s): ?int { ... } 是对的;而 function foo(? string $s)(问号后带空格)会报语法错误 Parse error: syntax error。
使用场景:
- 数据库字段可能为 NULL,映射到对象属性或方法入参时需要显式允许
- API 接口某些字段非必填,对应参数需接受
null - 构造函数中部分依赖可选,用可空类型比设默认
null更语义清晰
可空类型 ≠ 联合类型,不能混用 | 写法
你不能写 string|null 作为类型声明(除非用 PHP 8.0+ 的联合类型),?string 和 string|null 在 PHP 7.1–7.4 是两套机制:前者是原生可空语法,后者在老版本直接报错;PHP 8.0 开始两者共存,但行为一致——都允许 null,不过 ?string 仍是更简洁、向后兼容性更好的写法。
容易踩的坑:
- 类属性不支持可空类型声明(PHP 7.4 才支持属性类型,但不支持
?string属性,只能用string|null联合类型或 PHP 8.0+) - 可空类型对
void无效——?void是非法的,void本身就不该有返回值 - 如果启用了严格模式(
declare(strict_types=1);),传null给非可空参数仍会报TypeError,哪怕变量值是null
实际例子:一个带可空参数和返回值的方法
function findUserById(int $id): ?array
{
$row = database_query("SELECT * FROM users WHERE id = ?", [$id]);
return $row ?: null;
}
<p>$user = findUserById(123); // 返回 array 或 null,不会报错
// findUserById(null); // 这里会报 TypeError,因为 $id 参数不是 ?int
</p>
注意:上面例子中 $id 没加 ?,所以传 null 会炸;但返回值用了 ?array,所以返回 null 安全。很多初学者会误以为“只要函数可能返回 null,就得给返回值加 ?”,其实不然——没加的话,返回 null 就直接 TypeError,PHP 不会自动宽容。
真正容易被忽略的是:可空类型只约束运行时值,不改变变量本身的类型推断;IDE 或静态分析工具(如 PHPStan)依赖它做检查,但如果你漏写了 ?,它们可能在开发阶段就报错,而不是等上线才崩。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











