You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何func_get_args()数组与显式数组作为函数参数表现不同?

为什么替换func_get_args()为显式数组后PHP偏应用函数报错?

核心问题是你混淆了不同函数作用域下的func_get_args(),两者属于完全不同的调用上下文:

正确代码的逻辑

在可正常运行的版本中:

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

这里的func_get_args()属于返回的匿名函数的作用域:当你调用$increment(2)时,它获取的是匿名函数被调用时传入的参数[2]。最终传给add的参数是...$args(即[1])加上...func_get_args()(即[2]),也就是[1, 2],完全符合add(int $a, int $b)的参数要求。

错误代码的逻辑

你替换后的代码:

return static fn() => $func(...$args, ...[ $func, ...$args ]);

这里的[ $func, ...$args ]引用的是**partial函数自身的参数**:也就是add(...)生成的闭包,以及partial接收的[1],展开后是[Closure, 1]。加上前面的...$args(即[1]),最终传给add的参数是[1, Closure, 1],第二个参数是闭包而非int,自然触发类型错误。

调试结果的误导性

你在partial函数内部做的调试:

echo func_get_args() === [ $func, ...$args ];   // Output: 1

这里的func_get_args()是**partial函数自己的参数**,确实等于[$func, ...$args],但这和匿名函数里的func_get_args()完全不是一回事——两者属于不同的函数调用栈,作用域完全隔离。

总结

  • partial函数里的func_get_args():获取调用partial(add(...), 1)时的参数
  • 匿名函数里的func_get_args():获取调用$increment(2)时的参数
    你把这两个不同作用域的参数数组搞混了,才导致替换后逻辑完全偏离预期。

内容的提问来源于stack exchange,提问作者lukas.j

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:46:04