为什么这个 php 函数有两个可变长度参数?[复制]

Why this php function has two variable-length parameters? [duplicate]

提问人:LF00 提问时间:11/10/2023 更新时间:11/10/2023 访问量:50

问:

在手动可变长度参数列表中,应该只有一个可变长度参数作为函数的最后一个参数。

但是为什么这个opentelemetry-php api函数:有两个呢?return $c(...$a, ...($a = []));

function trace(SpanInterface $span, Closure $closure, iterable $args = [])
{
    $s = $span;
    $c = $closure;
    $a = $args;
    unset($span, $closure, $args);

    $scope = $s->activate();

    try {
        /** @psalm-suppress InvalidArgument */
        return $c(...$a, ...($a = []));
    } catch (Throwable $e) {
        $s->setStatus(StatusCode::STATUS_ERROR, $e->getMessage());
        $s->recordException($e, ['exception.escaped' => true]);

        throw $e;
    } finally {
        $scope->detach();
        $s->end();
    }
}
php 函数 参数 open-telemetry 可变长度

评论

0赞 shingo 11/10/2023
这些是数组解包运算符 使用 splat 传递和接收具有关联数组的函数参数
1赞 Justinas 11/10/2023
这不是可变长度运算符,而是 splat(数组解包)运算符。 将接收数组中的所有值$c

答:

3赞 Nigel Ren 11/10/2023 #1

您制作的可变长度参数列表引用用于声明函数。如果您有 2 个声明的变量 - 它如何区分要将其添加到哪个变量。...

而例子

return $c(...$a, ...($a = []));

正在调用函数。这里是将数组值添加为参数的情况。

评论

0赞 LF00 11/13/2023
你能在这里解释一下第二部分吗?为什么要分配一个空数组然后展开它?$a
1赞 Nigel Ren 11/13/2023
@LF00,对不起 - 看起来他们试图确保某些东西被传递 - 但你可能不得不问原来的编码员。