【PHP8.6】PHPで関数の部分適用が使えるようになる

PHP8.5でパイプライン演算子が導入されたときに「どうして毎回クロージャを書かないといけないんだ」的なことを言ったわけですが、あれは次世代への布石のためでした。

ということで部分適用のRFCが提出されています。 まだ途中ですが実装も存在しており、順調に進めばPHP8.6で導入されることになります。 コア開発者が多数参加していることもあり、導入が遅れることはあっても却下されることはまずないのではないかと思います。

部分適用が何かってざっくり書くとこんなの。

PHP8.6? // 普通の関数 function substr5($str) { return substr($str, 0, 5); } echo substr5('abcdefg'); // abcde

// 第一級callable $f = substr5(...); echo $f('abcdefg'); // abcde

// 無名関数 $f = function ($str) { return substr($str, 0, 5); }; echo $f('abcdefg'); // abcde

// アロー関数 $f = fn ($str) => substr($str, 0, 5); echo $f('abcdefg'); // abcde

// 部分適用 $f = substr(?, 0, 5); echo $f('abcdefg'); // abcde ↑の結果は全部同じです。

以下は該当のRFC、Partial Function Application (v2)の紹介です。 RFCでは非常に細かなエッジケースも全て言及されているのですが、和訳は全部入れると見通しが悪くなるので(あと面倒)適当に端折っています。

Partial Function Application (v2) 関数の部分適用(PFA)とは、関数のパラメータのうち一部のみを指定し、残りのパラメータは後で実行するプロセスを表します。 論理的には以下の式と同一です。

function f(int $a, int $b, int $c) {}

$partialF = fn(int $b) => f(1, $b, 3); とはいえ無名関数では全てのパラメータを写経する必要があり、たいへん面倒な作業です。 コールバックやパイプ演算子を組み合わせると、この厄介さは特に顕著になります。