我有以下代码(用于部分应用):
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
使用显式构建的数组构建的参数一起使用并崩溃。
在第一个示例中,您
func_get_args
在静态箭头函数的范围内调用,但在第三个示例中,它是在partial
函数的范围内调用的。参数2
传递给静态箭头函数: