使用Splat语法传递关联数组作为函数参数的行为疑问
PHP可变参数展开保留数组键的行为说明
先看你给出的代码:
function myfunc(mixed ...$var) { dump($var); } $param = [ 'one' => 1, 'two' => 2, ]; myfunc(...$param);
执行后输出保留了数组的键名:
^ array:2 [ "one" => 1 "two" => 2 ]
针对你的疑问,明确说明:
- 这是PHP官方有意设计的稳定行为,不是临时特性,未来版本不会随意移除。
- 虽然你在可变参数的直接文档章节没找到相关描述,但PHP的数组展开(
...操作符)语法规范里,明确包含了这个规则:当把关联数组展开到使用...$var收集参数的函数中时,会完整保留原数组的键值对结构。 - 这个特性从PHP 5.6引入可变参数和数组展开语法时就存在,多年来一直保持稳定,属于语言的标准特性。
- 额外补充:如果函数是固定数量的位置参数,展开关联数组时会忽略键名,只按顺序传递值;只有当用可变参数
...$var收集时,才会保留键名。
内容的提问来源于stack exchange,提问作者joachim
相关产品推荐
相关产品推荐

