代码 PHP 8.6 部分函数应用:? 补上的参数会变成必填,且参数在创建分部时就会求值

2026-11-15 21:01:18

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)。

复制全文 生成海报 PHP 闭包 版本特性

推荐文章

程序员茄子在线接单