php 7.0 不支持 ?array 或 array|null 类型声明,strict_types=1 下 array 参数拒绝 null 并抛 typeerror;空数组[]合法,null 则非法;可行方案为移除类型声明+手动检查、设默认值=[]或用mixed+运行时校验;升级至 php 7.1+ 可原生支持可为空数组。

PHP 7.0 本身不支持 ?array 或 array|null 这类可为空数组类型声明,因此在 declare(strict_types=1) 下,**无法直接定义“空数组”作为合法值**——因为 array 类型声明本身**拒绝 null**,且 PHP 7.0 尚未引入可为空类型语法。
strict_types=1 对 array 类型的硬性约束
启用严格模式后,array 参数或返回值必须是真实数组(is_array() === true),任何其他类型(包括 null、false、''、0)都会触发 TypeError,不会进行隐式转换或宽松容错。
-
function handle(?array $data) { }—— PHP 7.0 会报语法错误:不识别?前缀 -
function handle(array $data) { }—— 若传入null,立即抛出Fatal error: Uncaught TypeError - 空数组
[]是合法的array,完全允许;但null不是空数组,它是完全不同的类型
PHP 7.0 中模拟“可选数组”的可行方式
由于缺乏原生可为空语法,开发者需绕过类型系统限制,同时兼顾可读性与运行时安全:
- 去掉类型声明,用文档注释 + 手动判断:
/** @param array|null $data */ function handle($data) { if ($data === null) { ... } elseif (!is_array($data)) { ... } } - 使用默认参数
= []表示“无数据时视为空数组”,避免传null:function handle(array $data = []) { ... } - 若必须接受
null,只能声明为mixed,再在函数内做is_array()或=== null检查
为什么不能把 null 当作“空数组”来用?
这是类型语义的根本区别:
-
null表示“值不存在”或“未初始化”,不是容器,没有键、没有长度、不可遍历 -
[]表示“存在一个空的有序集合”,是完整数组实例,支持count()、foreach、array_merge()等操作 - strict_types=1 强化了这种区分:它不允许把语义上不等价的值混为一谈
升级建议:从 7.0 迈向更安全的表达
若项目已要求高类型安全,应考虑升级至 PHP 7.1+:
- PHP 7.1 起支持
?array,在 strict 模式下精准表达“数组或空值” - PHP 8.0+ 支持
array|null联合类型,与?array行为一致,且更易扩展(如string|int|null) - 搭配
declare(strict_types=1),三者协同才能实现零容忍的空值契约
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











