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



>目标

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

我尝试了什么

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的作用。

最新更新