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

2024-04-28

Goal

我想写一个函数可变数量的参数(使用...) https://secure.php.net/manual/en/functions.arguments.php#functions.variable-arg-list.new使用相同的参数和新的参数调用另一个函数在最后。订单很重要!下面的例子只是为了演示。

我尝试过的

function foo(...$params) {
    $extraVariable = 6;
    var_dump(...$params, $extraVariable);
}
foo(2, 4, 1, 4);

Problem

当我运行它时,我收到以下错误消息:

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

我怎样才能实现我的目标?


tl;dr

设计上不允许在参数后解包,但有 3 种解决方法:

  • 从新元素创建一个数组并将其解压为保罗建议 https://stackoverflow.com/posts/comments/86579098:

      function foo(...$params) {
          $extraVariable = 6;
          var_dump(...$params, ...[$extraVariable]);
      }
    
  • 将新元素推送到参数:

      function foo(...$params) {
          $extraVariable = 6;
          $params[] = $extraVariable;
          var_dump(...$args);
      }
    
  • 如果包装的函数具有命名参数,只需添加额外的参数作为命名参数,如下所示詹姆斯建议 https://stackoverflow.com/a/74778728/1494454:

      // needs PHP 8.1
      function foo(...$params) {
          $extraVariable = true;
          array_search(...$params, strict: $extraVariable);
      }
    

解释

PHP 根本不支持这一点。您可以看到检查此行为的单元测试 https://github.com/php/php-src/blob/master/Zend/tests/arg_unpack/positional_arg_after_unpack_error.phpt:

--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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 致命错误:参数解包后无法使用位置参数 的相关文章

随机推荐