?array表示“数组或null”,非“数组或空数组”;null语义为“无值/缺失”,[]是合法array类型的具体空值,二者类型、语义、运行行为均不同,必须用is_null()与is_array() && empty()严格区分。

?array 表示“数组或 null”,不是“数组或空数组”——它和空数组([])在语义、类型检查、运行行为上完全不同。
语义本质不同
?array 是一种可为空的类型声明,告诉 PHP:这个参数/返回值允许传入 null,也允许传入任何合法数组(包括空数组)。而空数组 [] 本身是 array 类型的一个具体值,完全不等于 null。
-
null表示“无值”“未提供”“缺失” -
[]表示“有值,且是一个不含元素的数组” - 函数接收
?array $data时,process(null)和process([])都合法,但含义截然不同
类型检查行为不同
启用 declare(strict_types=1) 后:
- 传
null给array $data→ 触发Fatal error: Uncaught TypeError - 传
null给?array $data→ 通过检查,$data值为null - 传
[]给两者都可通过,因为[]是有效数组
实际使用中如何区分
判断逻辑必须明确区分 null 和 [],不能混为一谈:
- 用
is_null($data)或$data === null检查是否缺失 - 用
is_array($data) && empty($data)检查是否为空数组 - 常见误写:
if (!$data) { ... }—— 这会把[]、false、0、""全部当“假”,不可靠
为什么不能用默认值替代 ?array
写成 array $data = [] 看似也能接受“没传”,但它掩盖了语义:
- 调用方不传参数时,自动填充
[],无法区分“用户没给”和“用户给了一个空数组” -
?array $data强制调用方显式表达意图:传数组,或明确传null - 静态分析工具(如 PHPStan)能据此识别空值风险,而默认值写法会漏掉这类提示
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











