我有以下代码(用于部分应用):
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
被传递给静态箭头函数:
function partial(Closure $func, mixed ...$args): Closure
{
return static fn(...$args_i) => $func(...$args, ...$args_i);
}