>目标
我想编写一个具有可变参数数量的函数(使用 ...
(,该函数调用另一个具有相同参数的函数,并在最后调用一个新函数。顺序很重要!下面的示例仅用于演示。
我尝试了什么
function foo(...$params) {
$extraVariable = 6;
var_dump(...$params, $extraVariable);
}
foo(2, 4, 1, 4);
问题
当我运行它时,我收到以下错误消息:
我PHP 致命错误:在第 3 行的/home/user/main.php 中解压缩参数后无法使用位置参数
怎样才能实现我的目标?
tl;dr
设计不允许在参数后解压缩,但有 3 种解决方法:
-
从新元素创建一个数组,并按照 Paul 的建议将其解压缩:
function foo(...$params) { $extraVariable = 6; var_dump(...$params, ...[$extraVariable]); }
-
将新元素推送到参数:
function foo(...$params) { $extraVariable = 6; $params[] = $extraVariable; var_dump(...$args); }
-
如果包装的函数有命名的参数,只需按照 James 的建议添加额外的参数作为命名参数:
// needs PHP 8.1 function foo(...$params) { $extraVariable = true; array_search(...$params, strict: $extraVariable); }
解释
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
有一个解决方法。解压缩后不能使用位置参数,但可以使用多个解压缩参数;因此,您只需将变量包装在数组文字中并像这样解包它:
var_dump(...$params, ...[$extraVariable]);
看到粗体字了吗?
PHP 致命错误:在第 3 行的/home/user/main.php 中解压缩参数后无法使用位置参数
因此,请在打开包装之前使用它。
var_dump($extraVariable, ...$params);
现在可以通过 PHP 8.1 和命名参数来实现这一点。
function foo(...$params) {
$this->otherfunction($params, otherParam: 'some value');
}
foo(2, 4, 1);
在otherfunction()
中,您将$params
的扩展值作为数组[0 => 2, 1 => 4, 2 => 1]
,并且您的$otherParam
将具有值"某些值"。
注意:您说:
我想编写一个参数数量可变的函数(使用...调用具有相同参数和最后的新一个
上面带有命名参数可以解决的问题,但您的示例使用 var_dump()
.传播在var_dump()
不起作用,但随后您只需转储数组本身,因为这就是var_dump的作用。