PHP 7.0 到 8.2 定义空数组语法无断裂,[] 和 array() 均合法可用;安全落地取决于使用场景、上下文约束及工具链检查,需重点防范动态属性赋值、类型契约不匹配和非安全数组访问三类风险。

PHP 7.0 到 8.2 全版本定义空数组,本身没有语法断裂——[] 和 array() 在这段版本区间内都合法可用,但能否“安全落地”,取决于你用在哪、怎么用、以及是否被工具链或运行时环境约束。
核心判断:先看目标兼容底线
若项目明确支持 PHP 7.0+(即最低为 7.0),则:
✅ [] 完全可用(PHP 5.4 起支持,7.0 当然包含)
✅ array() 全版本兼容,语义更显式,部分老旧静态分析器更友好
❌ new ArrayObject() 或 SplFixedArray 不是“定义空数组”的常规写法,属特定场景,不建议用于通用初始化
自动化检查要盯住这三类风险点
单纯检测 [] 或 array() 是否出现,意义不大。真正该由工具自动捕获的是以下上下文问题:
-
动态属性赋值:如
$obj->data = [];出现在未声明public array $data的类中 → PHP 8.2 报Fatal error,PHP 8.0+ 已启用严格模式可提前预警 -
类型契约不匹配:函数参数声明为
function foo(?array $items),却传入null;或返回声明为array,却实际返回''或0→ PHP 8.0+ 启用严格类型后直接 TypeError -
空数组参与非安全访问:如
$config['db']['host']前未做$config['db'] ?? []防御 → PHP 8.1+ 报Trying to access array offset on value of type null
用 PHPCompatibility + 自定义规则集实现自动化
推荐组合:PHP_CodeSniffer + PHPCompatibility 规则集,配合项目级配置:
- 在
ruleset.xml中设定版本范围:<config name="testVersion" value="7.0-8.2"></config> - 启用关键检查项:
<rule ref="PHPCompatibility.LanguageConstructs.NewLanguageConstructs"></rule>(捕获[]使用合规性) - 排除干扰项:如无需检查已废弃函数,则排除
PHPCompatibility.FunctionUse.RemovedFunctions - 补充自定义 sniff:检测未声明属性赋值空数组(正则匹配
\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\s*=\s*\[\];并确认左侧类无对应 property 声明)
CI/CD 中一键验证的实操命令
在 GitHub Actions 或 GitLab CI 中加入:
立即学习“PHP免费学习笔记(深入)”;
composer require --dev phpcompatibility/php-compatibility vendor/bin/phpcs --standard=PHPCompatibility --runtime-set testVersion 7.0-8.2 src/ tests/
若需更深度语义检查(如类型流分析),可叠加 phpstan 配置:phpstan analyse --level max --configuration phpstan.neon src/
其中 phpstan.neon 应启用 checkExplicitMixed: true 和 strict: true,确保 [] 被识别为 array 而非宽松的 mixed。



















