相同的数组(一个来自 func_get_args() 和一个显式构建的数组)在用作参数时并不相同

问题描述 投票:0回答:1

我有以下代码(用于部分应用):

function partial(Closure $func, mixed ...$args): Closure
{
  return static fn() => $func(...$args, ...func_get_args());
}

function add(int $a, int $b): int
{
  return $a + $b;
}

$increment = partial(add(...), 1);

echo $increment(2);   // Output: 3

我想用显式构建的数组替换

func_get_args
,但我没有成功地将它用作函数的参数:

function partial(Closure $func, mixed ...$args): Closure
{
  return static fn() => $func(...$args, ...[ $func, ...$args ]);
}

function add(int $a, int $b): int
{
  return $a + $b;
}

$increment = partial(add(...), 1);

echo $increment(2);   // Fatal error: Uncaught TypeError: add(): Argument #2 ($b) must be of type int, Closure given

我向 partial 添加了调试行,以查看显式构建的数组是否等于给定 buy

func_get_args
的数组,事实是这样的:

function partial(Closure $func, mixed ...$args): Closure
{

  echo func_get_args() === [ $func, ...$args ];   // Output: 1

  // or for the whole argument list handed over to $func:
  echo [ ...$args, ...func_get_args() ] === [ ...$args, ...[ $func, ...$args ] ];   // Output: 1

  return static fn() => $func(...$args, ...[ $func, ...$args ]);   // Crashes anyway

}

两条测试线显示它们是相等的。因此,我不明白为什么它与使用

func_get_args
构建的参数一起工作,并在使用显式构建的数组时崩溃。

php
1个回答
0
投票

在第一个示例中,您在静态箭头函数的范围内调用

func_get_args
,但在第三个示例中,它是在
partial
函数的范围内调用。参数
2
被传递给静态箭头函数:

function partial(Closure $func, mixed ...$args): Closure
{
  return static fn(...$args_i) => $func(...$args, ...$args_i);
}
© www.soinside.com 2019 - 2024. All rights reserved.