PHP 8.0+ 中空数组仍支持 [] 和 array() 两种写法,无废弃或替换关系;其新特性体现在与类型系统、match 表达式及性能优化的更好融合,兼容性风险主要来自键名转换、解构语法等严格校验变化。

PHP 8.0+ 定义空数组本身没有新增语法,[] 和 array() 两种写法完全等效且均被官方支持,不存在“废弃”或“替换”关系。所谓“新特性”,实际体现在它如何更自然地融入现代 PHP 的类型系统、表达式语义和性能优化机制中;而向下兼容的关键,不在于空数组怎么写,而在于你用在什么上下文、跑在什么版本、是否混用了易出错的模式。
✅ 空数组在 match 表达式中是理想返回值
PHP 8.0 引入的 match 是纯表达式,分支右侧必须是值,不是语句。空数组 [] 天然适配这一设计:
- 可直接作为分支结果:
$res = match($code) { 200 => ['data' => $x], 404 => [], default => null }; - 满足
array类型声明,比array()更轻量、语义更清晰 - 不参与左侧匹配比较,不受 strict 模式影响,安全性与可读性兼得
- 避免写成
'log' => $arr = []这类带副作用的赋值——这违背match的函数式初衷
⚠️ 类属性声明需注意版本分水岭
类中定义空数组默认值,语法选择取决于目标最低 PHP 版本:
-
public $data = array();—— 兼容 PHP 4.0 起所有版本,最稳妥 -
public $data = [];—— PHP 5.4+ 支持,但 PHP 7.4 以下无法用于类型声明 -
public array $data = [];—— 仅 PHP 7.4+ 支持(属性类型 + 默认值),PHP 8.0+ 推荐 -
public readonly array $data = [];—— PHP 8.2+ 才支持只读数组属性(注意:只读的是属性引用,非数组内容)
? 真正要警惕的“兼容性风险”不在空数组本身
升级到 PHP 8.0+ 后报错,90% 不是因为写了 [],而是以下行为被新版本更严格地校验:
-
键名隐式转换变化:PHP 8.0 对数字字符串键(如
"01"、"1.0")不再自动转整型,导致array_keys()结果、foreach遍历顺序可能不同 -
解构语法收紧:PHP 8.0+ 中
[$a, $b] = [];直接抛ValueError,旧版仅警告或静默失败 -
函数返回值类型冲突:启用
strict_types=1后,array_filter()返回空数组再取[0]可能返回null,违反函数声明的非空类型 - JIT 编译敏感路径:空数组初始化虽不触发 JIT,但后续若在热函数中动态混用键类型、无预分配扩容,会引发 JIT 缓存抖动甚至内存异常
? 迁移老项目时的实用建议
不追求语法更新,优先保障稳定运行:
- 用
PHPCompatibility规则扫描全项目,把[]统一替换成array()(尤其在类属性、三元表达式、函数返回处) - 对外部输入构造的数组,显式校验键类型,避免依赖隐式转换;用
(int)$key或(string)$key明确意图 - 判断数组为空,优先用
empty($arr)或!$arr,而非count($arr) === 0 - 接收参数时善用可空类型:
function process(?array $items): void,防止传入null导致foreach崩溃
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











