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

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);
}

Php相关问答推荐

Woocommerce将自定义数据添加到自定义文件中购物车中的产品

PHP -使用preg_match在字符串中进行匹配

根据在WooCommerce购物车和 checkout 中 Select 的送货方式显示快捷代码内容

ForHumans函数中的月当量与单位限制

Laravel POST方法返回状态:POST方法上不允许使用405方法

如何确保所有语言文件都使用Laravel中的新密钥进行更新?

删除了数组中的值,而不是多个数组

列出所有WooCommerce处理订单中的产品数量,SKU和品牌

使用php ZipArhive类将Zip压缩文件分成多个部分

如何在execute语句中使用存储过程参数?

首先在WooCommerce我的帐户订单页面中移动操作按钮

允许客户定义特定WooCommerce产品的价格

无法在Laravel中将日志(log)通道设置为空

WooCommerce在收据页面获取产品下载URL

Woocommerce 仅在前端为登录用户提供价格折扣

如何在 PHP 中以 hh:mm:ss 格式获取两个 strtotime datetime/s 之间的时间差

woocommerce checkout 页面上的自定义字段

如何在 php 中获取正确的时间

如何故意创建不同的错误(404,500,419)? Lavravel PHP

如何在 Laravel 中验证多个输入?