PHP致命错误:参数解压缩后无法使用位置参数

tot*_*dli 1 php variadic-functions

任务

我想编写一个具有可变数量参数的函数(使用...,该函数调用具有相同参数的另一个函数,并在末尾调用一个新的函数。订单很重要!下面的示例仅用于演示。

我尝试了什么

function foo(...$params) {
    $extraVariable = 6;
    var_dump(...$params, $extraVariable);
}
foo(2, 4, 1, 4);
Run Code Online (Sandbox Code Playgroud)

问题

运行它时,出现以下错误消息:

PHP致命错误:在第3行的/home/user/main.php中解压缩参数后,无法使用位置参数

我如何实现我的目标?

tot*_*dli 5

tl; dr

设计不允许在参数后解压缩,但是有两种解决方法:

说明

PHP根本不支持此功能。您可以看到检查此行为单元测试

--TEST--
Positional arguments cannot be used after argument unpacking
--FILE--
<?php

var_dump(...[1, 2, 3], 4);

?>
--EXPECTF--
Fatal error: Cannot use positional argument after argument unpacking in %s on line %d
Run Code Online (Sandbox Code Playgroud)

  • 但是,您可以在打开包装后再打开包装,因此`var_dump(... $ params,... [$$ traVariable])`也可以使用。 (5认同)

小智 5

有一个解决方法。解包后不能使用位置参数,但可以使用多个解包参数;因此,您可以将变量包装在数组文字中,然后像这样解开它:

var_dump(...$params, ...[$extraVariable]);
Run Code Online (Sandbox Code Playgroud)