PHP 7.1 的 ?array 可空类型需在 strict_types=1 模式下启用,否则会静默转换非数组值;它明确区分 null(未提供)与空数组(提供但无数据),改造时须同步更新逻辑判断、工具链和注释。

必须启用严格模式
可空类型只有在 strict_types = 1 模式下才真正生效。若未声明,PHP 会回退到弱类型转换逻辑,导致 ?array 对字符串 "123" 或整数 0 等值“静默转换”,掩盖真实问题。
- 在每个使用可空类型的文件顶部添加:
declare(strict_types=1); - 注意:该声明只对当前文件生效,不能继承到
include或require的文件中 - 未启用时,
function foo(?array $a) {}调用foo("abc")不报错,但实际传入的是字符串——这不是预期行为
区分 null 和空数组的业务语义
?array 允许 null 和 [],但二者含义往往不同:前者表示“未提供/不可用”,后者表示“明确提供但为空集合”。改造时不能仅做类型适配,还要检查逻辑分支是否仍正确。
- 例如数据库查询:返回
null表示“查无此记录”,返回[]表示“查到但结果为空列表” - 原代码若写
if (empty($items)) { ... },升级为?array $items后,empty(null)也为true,可能误合并两种情况 - 建议显式判断:
if ($items === null)处理缺失,if (is_array($items) && empty($items))处理空集合
联合类型兼容性与版本边界
?array 是 PHP 7.1 引入的语法糖,等价于 array|null,但它 ≠ PHP 8.0+ 的联合类型(如 array|int|null)。混用易出错:
- PHP 7.1–7.4 不支持
array|null写法(会解析为语法错误),只能用?array - PHP 8.0+ 支持两种写法,但
?array仍是推荐形式,更简洁且向后兼容 - 若项目需同时兼容 7.4 和 8.0+,避免使用
array|null;若已升至 8.0+,可逐步统一为联合类型风格以提升可读性
静态分析与 IDE 支持需同步更新
启用可空类型后,若未同步配置工具链,反而会降低开发效率:
立即学习“PHP免费学习笔记(深入)”;
- PHPStan / Psalm 需升级到支持 PHP 7.1+ 类型的版本(如 PHPStan v0.12+),否则无法识别
?array并报错 - IDE(如 PhpStorm)需启用 PHP Language Level ≥ 7.1,并开启 “Enable nullable type hints” 选项,才能正确推导变量类型、提供补全和空值警告
- 注释中的
@param array|null $x应逐步替换为原生?array $x,避免注释与代码脱节



















