php 8.0 中空数组默认值必须显式声明为 [] 而非 null,以确保命名参数正确跳过并自动绑定空数组,同时需将 is_null() 检查改为 empty() 或 count() === 0。

PHP 8.0 中为函数或构造函数参数定义空数组默认值,核心不是“怎么写语法”,而是“怎么设计才既安全又利于命名参数发挥优势”。关键在于:空数组 [] 必须作为类型兼容的字面量直接声明,不能靠 null + 运行时判断来“模拟”。
空数组默认值必须显式声明为 [],而非 null
命名参数跳过某个参数的前提是它有明确、合法的默认值。如果写成 array $filters = null,调用时省略 filters: 就会传入 null,触发类型错误;而 array $filters = [] 才能让 PHP 自动绑定空数组。
- ✅ 推荐:
public function __construct(string $name, array $options = []) - ❌ 避免:
public function __construct(string $name, array|null $options = null)—— 这样调用new X('test')传的是null,不是[] - ⚠️ 注意:
[]和null类型不同,不能混用。已有逻辑依赖is_null($options)的,需同步改为empty($options)或count($options) === 0
命名参数调用时,空数组参数可完全省略
一旦声明了 array $data = [],你就能在调用时跳过它,无论它在参数列表中第几位。命名参数不关心位置,只认名字和默认值。
- 示例构造函数:
function __construct(string $title, array $tags = [], int $limit = 10, bool $enabled = true) - 合法调用:
new Post(title: 'Hello', enabled: false)→$tags自动为[],$limit自动为10 - 无需再写:
new Post('Hello', [], 10, false)—— 易错、难读、难维护
兼容性与语法选择:按最低 PHP 版本决定写法
空数组字面量 [] 从 PHP 5.4 起可用,但结合类型声明时版本要求更高:
- PHP 7.4+:支持属性类型 + 默认值,如
public array $config = []; - PHP 8.0+:推荐统一用
array $param = [],配合命名参数语义清晰 - 需兼容 PHP 7.3 或更早?只能退回到
array $param = array(),效果等价但略冗长
常见错误:动态值、可变参数、内置函数不支持命名参数
空数组默认值再规范,也救不了这些场景:
- ❌ 函数参数含
...$args:命名参数无法绑定到可变参数上 - ❌ 调用
implode(separator: ',', array: $arr):内置函数不支持命名参数,会报错 - ❌ 默认值写成
$timeout = time():函数签名解析阶段就失败,必须是字面量 - ❌ 混用顺序错误:
foo($a, b: 2, $c)—— 命名参数后接位置参数,语法不允许
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











