为何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
相关产品推荐
相关产品推荐

