?array 表示数组或 null 的联合类型,非空数组;必须用于数据可能天然缺失的场景,如数据库无结果、api 可选字段、配置未设置等;使用时须显式区分 null 与 [],禁止用 empty() 判空,类属性需初始化为 null,php 8.0+ 中与 array|null 等价。

PHP 7.1 引入的 ?array 不是定义“空数组”,而是定义“数组或 null”的联合类型——它明确表示该值要么是一个合法数组,要么是 null,绝不接受字符串、整数、false 等其他类型。这是类型安全的第一道防线,不是语法糖,而是语义契约。
什么时候必须用 ?array 而不是 array
关键在于数据来源是否天然可能缺失:
- 数据库查询无匹配结果(如 PDO::fetch() 返回
null或false,上层应统一接收?array) - API 请求中某个字段为可选数组(JSON 解码后该键不存在 → 值为
null,而非[]) - 配置文件未设置某项(
parse_ini_file或yaml_parse返回null) - 缓存未命中或初始化失败,需返回
null表示“暂无数据”,而非伪造空数组
如何安全使用 ?array 参数
声明类型只是起点,运行时仍需按语义区分 null 和 []:
- 不用
empty($items)判空——因为empty(null) === true,会把null误当作“空数组”处理 - 先显式判断:
if ($items === null),再决定是跳过、报错还是 fallback - 禁止未检查直接
foreach或count,否则触发TypeError - 若业务上
null(未提供)和[](明确提供空列表)含义不同,必须分开处理,不可合并
类属性与构造函数中的写法
PHP 7.4+ 支持属性类型声明,但有明确限制:
- 类属性必须显式初始化为
null:public ?array $tags = null; - 不能只写
public ?array $tags;(会报错:未初始化) - 构造函数中接收可为空数组:
public function __construct(?array $tags = null) { $this->tags = $tags; } - 返回值也建议声明为
?array,让调用方清楚知道结果可能为null
PHP 8.0+ 中 ?array 与 array|null 的关系
两者语义完全一致,但适用阶段和风格不同:
-
?array是 PHP 7.1+ 提供的简洁写法,仅适用于“某类型或 null”这一种情形 -
array|null是 PHP 8.0+ 联合类型语法的一部分,更通用,适合复杂组合(如string|int|null) - 混用不会报错,但建议项目内统一风格;启用
declare(strict_types=1)后,二者对非法值的拦截行为完全相同
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











