Tenho o seguinte código (para aplicação parcial):
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
Eu queria substituir func_get_args
por um array construído explicitamente, mas não tive sucesso em usá-lo como argumento para uma função:
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
Adicionei linhas de depuração ao parcial para ver se o array construído explicitamente era igual ao array fornecido buy func_get_args
, e é assim:
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
}
Ambas as linhas de teste mostram que são iguais. Portanto, não entendo por que ele funciona com os argumentos criados func_get_args
e trava ao usar o array construído explicitamente.