PHP 8.6 部分函数应用:? 补上的参数会变成必填,且参数在创建分部时就会求值
RFC:https://wiki.php.net/rfc/partial_function_application_v2
PFA(partial function application)允许只给函数填一部分参数,返回一个接收剩余参数的闭包。? 占位单个参数,... 占位剩余全部参数:
$makeSlug = str_replace(' ', '-', ?);
$makeSlug('Hello World'); // Hello-World
$titles = array_map(strtolower(?), $titles);
生成的闭包保留原函数的参数名、类型和默认值。
? 补上的参数在闭包里是必填
后续 RFC 明确:每个 ? 占位符在生成的闭包上都变成必填参数,即使原函数对应的参数是可选的。想让这个参数保持可选、由调用方省略,就不该用 ? 占位。
已填参数在创建分部时求值
已提供的参数在创建分部时就求值一次,不是调用闭包时才求值。写 PFA 那一行,后面的表达式结果就固定了:
$i = 0;
$f = str_repeat(?, ++$i); // ++$i 在此刻求值为 1
$i = 10;
$f('x'); // 'x',不是十个 x
传入的是变量、函数调用还是常量表达式,都一样:值在构造闭包时被捕获。
... 表示剩余全部参数
... 占位剩余的所有参数,生成的闭包变参接收剩余的实参。
性能:array_map 的回调会被编译成 foreach
UPGRADING 的性能说明里有两条相关优化:
printf()只使用"%s"和"%d"时,编译成等价的字符串插值,省掉函数调用和反复解析格式串的开销。array_map()的回调是 first-class callable 或部分函数应用时,编译成等价的 foreach 循环,省掉中间 Closure 的创建、从内部函数调用 userland 回调的开销,也让 JIT 有更好的优化依据。
版本状态
该提案的早期版本在 2021 年被拒,v2 RFC 以 33:0 通过。PHP 8.6 GA 计划于 2026-11-19,当前最新预发布为 8.6.0RC7(2026-11-12)。