【问题标题】:PHP Fatal error: Cannot use positional argument after argument unpackingPHP致命错误:参数解包后无法使用位置参数
【发布时间】:2018-04-11 18:06:57
【问题描述】:

任务

我想用variable number of parameters (using ...) 编写一个函数,该函数调用另一个具有相同参数的函数,在末尾​​strong>调用一个新函数。顺序很重要!下面的例子只是为了演示。

我尝试了什么

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

问题

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

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

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

【问题讨论】:

  • 如果反对者指出我的问题存在的问题,我将不胜感激。
  • @emix 这到底是怎么复制的?该线程不包含任何与参数解包相关的内容。

标签: php variadic-functions


【解决方案1】:

tl;博士

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

  • 从新元素创建一个数组并将其解压缩为Paul suggested

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

    function foo(...$params) {
        $extraVariable = 6;
        $params[] = $extraVariable;
        var_dump(...$args);
    }
    

说明

PHP 根本不支持这个。你可以看到unit test that checks this behavior

--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])也可以。
  • @PaulCrovella 确实,这是一个更简洁的解决方案!谢谢。
【解决方案2】:

看到粗体字了吗?

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

所以解包之前使用它。

var_dump($extraVariable, ...$params);

【讨论】:

  • 看到粗体字了吗? "用相同的参数调用另一个函数最后是一个新函数"
  • 嗨,好点子,但如果对他来说顺序很重要,他希望$extraVariable 到底是什么?
  • @PaulCrovella:似乎是一个不合理的约束,但他们有其他答案。
  • 这是一个很好的解决方法,但我的问题明确指出“最后是一个新的”。
【解决方案3】:

一种解决方法。解压后不能使用位置参数,但可以使用多个解压参数;所以你可以把你的变量包装在数组文字中,然后像这样解开它:

var_dump(...$params, ...[$extraVariable]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2021-08-12
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多