代码之家  ›  专栏  ›  技术社区  ›  lukas.j

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

php
  •  1
  • lukas.j  · 技术社区  · 3 周前

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

    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
    

    我将调试行添加到 部分的 查看显式构建的数组是否等于给定的buy数组 函数集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
    
    }
    

    两条测试线显示它们相等。因此,我不明白为什么它能与构建的论点一起工作 函数集args 并且在使用显式构建的数组时崩溃。

    1 回复  |  直到 3 周前
        1
  •  2
  •   shingo    3 周前

    在第一个示例中,您调用 func_get_args 在静态箭头函数的范围内,但在第三个示例中,它是在的范围内调用的 partial 作用论点 2 传递给静态箭头函数:

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