声明 ?array 时必须显式提供 null 默认值,否则未传参会报错;不能用 empty() 区分 null 和空数组,需用 === null 严格判断;foreach 和 count 等函数对 null 会抛 typeerror;返回值也应声明为 ?array 以匹配可能的 null;?array 仅等价于 array|null,非联合类型。

声明 ?array 时必须显式提供 null 默认值
只写 function process(?array $items) { ... } 是合法的,但调用方传 null 时不会自动 fallback——它只是放宽类型约束,不改变逻辑行为。真正安全的做法是补上默认值:function process(?array $items = null) { ... }。否则,未传参时 PHP 不会自动填 null,而是报错“Missing argument”。类属性同理:public ?array $data = null; 是必须的,public ?array $data; 会直接报 Parse Error。
不能用 empty() 判断 ?array 是否为空
empty(null) 和 empty([]) 都返回 true,但语义完全不同:一个是“未提供”,一个是“明确提供了空数组”。业务上需要区分时,必须先做严格比较:if ($items === null)。常见错误包括:
- 直接
foreach($items as ...)→ 触发Fatal error: Uncaught TypeError: foreach() argument must be of type array - 直接
count($items)→ 同样抛TypeError - 用
is_array($items) && !empty($items)→ 漏掉null的情况,且is_array(null)返回false,逻辑断裂
返回值也该声明为 ?array
如果函数内部对 null 输入做了处理并返回 null(比如数据库查无结果),返回类型就必须写成 ?array。否则调用方拿到 null 却以为一定是数组,后续操作大概率崩溃。示例:function fetchTags(int $id): ?array { return $id === 123 ? ['php', 'web'] : null; }。这里不写 ?array,而写 array,PHP 在 strict mode 下会拒绝返回 null。
别混淆 ?array 和 array|string|null
?array 等价于 array|null,仅允许数组或 null;而 array|string|null 是联合类型(PHP 8.0+),允许三种值。PHP 7.1 不支持原生联合类型,所以 ?array|string 是非法语法——问号只作用于紧邻的类型名。如果真需要多类型,要么升级到 PHP 8.0+,要么用 mixed(但失去类型精度)。
最常被忽略的是:类型声明只是契约,不自动帮你做空值处理。哪怕写了 ?array,该判 === null 还得判,该保护 foreach 还得包一层。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











