当前位置: 首页 > news >正文

PHP 8.6 即将支持部分函数应用

PHP 8.6 即将支持部分函数应用

你有没有遇到过这种情况:明明只是想写个简单的回调,结果却写成了一篇小作文——箭头函数里塞满了类型声明、参数重排,还有一堆样板代码,就为了传一个值?

好消息是,PHP 8.6 将引入部分函数应用(Partial Function Application),让我们的日子好过一些。

原文链接 PHP 8.6 即将支持部分函数应用

什么是部分函数应用?

PHP 8.6 的部分函数应用允许你通过调用函数时传入部分参数,并用占位符表示剩余参数,来创建一个"预配置"的 callable。PHP 不会立即执行函数,而是返回一个 Closure,其参数列表会根据缺失的部分自动推导。

占位符有两种:

  • ? 表示"这里需要一个参数"
  • ... 表示"转发所有剩余参数"

来看一个基本示例:

function add4(int $a, int $b, int $c, int $d): int 
{return $a + $b + $c + $d;
}// 先填一部分,留一个以后再传:
$f = add4(1, ?, 3, 4);
// 等价于:
$f = static fn(int $b): int => add4(1, $b, 3, 4);echo $f(2); // 1+2+3+4 = 10

如你所见,我们通过部分应用 add4 函数创建了一个新的 callable $f,传入了部分参数,用占位符表示缺失的参数。之后调用 $f 并传入剩余参数就能得到最终结果。

你也可以把 PFA 看作是 first-class callable 的扩展。

多个占位符

你可以留多个"坑":

$f = add4(1, ?, 3, ?);
// 等价于:
$f = static fn(int $b, int $d): int => add4(1, $b, 3, $d);echo $f(5, 7); // 1+5+3+7 = 16

... 表示"剩下的全部"

$f = add4(1, ...);
// 等价于:
$f = static fn(int $b, int $c, int $d): int => add4(1, $b, $c, $d);echo $f(2, 3, 4); // 10

有了 PFA,回调变得简洁且意图明确。不用再写一堆样板箭头函数来重排或固定参数了。只需在需要的地方放上 ?...,PHP 会帮你搞定剩下的。

$strings = ['hello world', 'hello there'];// 没有 PFA(啰嗦):
$result = array_map(static fn(string $s): string => str_replace('hello', 'hi', $s), $strings);// 有了 PFA:
$result = array_map(str_replace('hello', 'hi', ?), $strings);
// 每个元素会被传入 $subject 位置的 ? 占位符

与管道操作符配合

PFA 对管道操作符也很友好:

$foo|> array_map(strtoupper(...), ?)|> array_filter(?, is_numeric(...));
// 管道右侧需要一个一元 callable;PFA 可以简洁地提供

命名参数与顺序

function stuff(int $i, string $s, float $f, Point $p, int $m = 0): string { /* ... */ }// 命名参数乱序也没问题:
$c = stuff(?, ?, f: 3.5, p: $point);
// Closure 期望 (int $i, string $s)// 命名占位符可以定义自己的参数顺序:
$c = stuff(s: ?, i: ?, p: ?, f: 3.5);
// Closure 期望 (string $s, int $i, Point $p)

可变参数函数

function things(int $i, ?float $f = null, Point ...$points) { /* ... */ }// 保持可变参数开放:
$c = things(1, 3.14, ...);
// Closure 期望 (Point ...$points)// 强制固定数量(可变参数变成必需的槽位):
$c = things(?, ?, ?, ?);
// Closure 期望 (int $i, ?float $f, Point $points0, Point $points1)

Thunk 函数

用 PFA 可以轻松实现 Thunk 函数:

function expensive(int $a, int $b, Point $c) { /* 耗时操作 */ }// 预填所有参数,延迟执行:
$thunk = expensive(3, 4, $pt, ...); // 零必需参数的 Closure// 之后再执行:
$result = $thunk();

构造函数的限制

你不能对构造函数(new)使用部分应用。可以用静态方法或工厂函数代替:

$maker = Widget::make(?, size: 10); // OK
$new = new Widget(?, 10);           // 编译错误

实际案例

来看一个更实用的例子:给 HTTP 请求添加 header。我们可以预填 header 名称和值,把请求数组留到后面再传:

function addHeader(array $req, string $name, string $value): array 
{$req['headers'][$name] = $value; return $req;
}// 请求数组留空;预填 header 名称/值
$withAuth = addHeader(?, 'Authorization', 'Bearer TOKEN');$req = ['url' => '/me', 'headers' => []];
$req = $withAuth($req);

这样我们就创建了一个可复用的 callable $withAuth,它可以给任何传入的请求数组添加 Authorization header。

常见 PFA 模式

以下是一些与 PFA 相关的常用模式:

  • 一元回调array_map(in_array(?, $allowed, strict: true), $input)
  • 从左填充,剩余留空stuff(1, 'two', ...)
  • 命名参数设置,剩余留空stuff(f: 3.14, s: 'two', ...)
  • First-class callable(退化情况)func(...)

总结

部分函数应用将是 PHP 8.6 的一个强大新特性,在处理回调时可以显著减少样板代码并提高代码清晰度。通过允许你用占位符预配置函数,PFA 让创建简洁、意图明确的 callable 变得轻而易举,不再需要冗长的箭头函数。

更多关于部分函数应用的信息,请阅读官方 RFC。

http://www.jsqmd.com/news/86158/

相关文章:

  • Python 3.13字节码反编译终极指南:5分钟快速上手
  • Holo1.5开源:小模型颠覆AI界面操作,成本骤降80%挑战行业格局
  • 5个步骤掌握B站视频下载:永久保存4K高清内容
  • 北京婚姻法律师事务所排名及机构信息参考 - 品牌排行榜
  • Windows更新故障终极修复:一键自动化解决方案完全指南
  • 终极指南:10个技巧让你的Citra模拟器性能翻倍
  • Winlator终极指南:Android设备变身Windows游戏主机的完全手册
  • 如何在macOS上实现安卓USB网络共享的终极指南
  • 企业级Android应用分发的3大核心挑战与智能解决方案
  • 三大实战场景测评:VibeVoice-1.5B语音模型的真实表现
  • InternalAppStore:构建企业级私有Android应用分发平台的完整解决方案
  • Deep-Live-Cam GPU加速实战:从卡顿到流畅的5个关键步骤
  • Scribd电子书离线获取完整指南:打造个人离线数字图书馆
  • 微信小程序大文件传输性能优化:基于iview-weapp的智能断点续传架构设计
  • 终极指南:15分钟快速掌握Airflow 3.0自动化数据管道
  • 推荐工厂用工业洗地机品牌:哪些品牌值得关注 - 品牌排行榜
  • Linux设备驱动开发实战宝典:从零构建高性能驱动系统
  • 推荐工厂用工业吸尘器品牌,这些可靠选择了解一下 - 品牌排行榜
  • 冥想第一千七百三十一天(1731)
  • electerm主题编辑器深度定制:打造个性化终端视觉体验
  • RoutersOS CHR部署到PVE虚拟平台
  • 区块链应用监控技术:如何实现7x24小时实时追踪与状态管理?
  • 工业吸尘器厂家有哪些?行业热门品牌汇总 - 品牌排行榜
  • 对标颇尔(PALL)的国产过滤器品牌推荐 - 品牌排行榜
  • 水经注万能地图下载工具:5大核心功能快速上手指南
  • Android USB网络共享终极指南:5步实现macOS高速连接
  • 终极强化学习训练指南:5分钟搞定奖励曲线诊断与优化
  • 32B参数效率革命:IBM Granite-4.0重塑企业AI部署范式
  • 游戏AI自动化框架终极使用指南:从零开始构建智能游戏助手
  • 如何用Python脚本高效下载Gofile文件:完整操作指南