概要
PHP 8.5で新たに導入される パイプ演算子(|>) について解説。 この機能の基本的な使い方と 実用例 を紹介。 他言語との比較や、PHPにおける 歴史的経緯 を整理。 今後予定されている 関連機能(部分適用や関数合成) にも触れる。 PHP開発者にとっての メリットと可能性 を強調。
PHP 8.5のパイプ演算子(|>)とは
- PHP 8.5 で新たに追加される パイプ演算子(|>) の概要
- 左側の値を右側の関数(callable)へ 単一引数 として渡す構文
- 例:
$result = "Hello World" |> strlen(...);- 上記は
$result = strlen("Hello World");と同義
- パイプライン として複数回連結することで、処理の流れを簡潔に記述可能
- Unix/Linuxの シェルパイプ(|) に着想を得た設計
パイプ演算子の実用例
- 配列操作などの 複雑な処理を直感的に記述 できる利点
- 例:
$result = $arr |> fn($x) => array_column($x, 'tags') |> fn($x) => array_merge(...$x) |> array_unique(...) |> array_values(...);$resultは重複を除去し再インデックスされた配列になる
- 例:
- 従来のPHPでは ネストが深くなり可読性が低下、または一時変数が必要
- パイプチェーンにより、 match()ブロックなど一式で記述可能
パイプ演算子の背景と他言語との比較
- F#やOCaml、Elixir など関数型言語で普及している構文
- PHPでも Hack/HHVM で独自のパイプ構文が存在
- 2016年にSara Golemon氏がPHPへの導入を提案
- Hack流の
$$トークン利用は 非標準的かつ限定的 で不採用
- Hack流の
- 2020/2021年には Partial Function Application (PFA) との連携も議論
- PFAは複雑さから不採用となったが、 First Class Callables が導入
パイプ演算子の応用と発展性
- シンタックスシュガー としての役割
- 実装自体は単純だが、他機能との組み合わせで威力を発揮
- match()式 やクロージャ返却関数との連携で表現力向上
- 例:
$profit = [1, 4, 5] |> loadSeveral(...) |> filter(isOnSale(...)) |> map(sellWidget(...)) |> array_sum(...);
- 例:
- Maybeモナド のようなnull安全処理も簡単に実装可能
maybe()関数を使い、nullを自動的に伝播
- KotlinやC#の拡張関数 に近い柔軟性を獲得
- ストリーム処理やデータ変換にも応用範囲が広い
今後の展望と関連RFC
- Partial Function Application の再挑戦
- 1引数化や柔軟な関数適用を目指す
- PHP 8.5以降に導入予定、開発中
- 関数合成演算子 の検討
- 複数関数の合成でパイプラインの最適化を狙う
- PHP 8.6以降の実装を目指す
- PHP Foundationチームの Ilija Tovilo氏、Arnaud Le Blanc氏 らの貢献
パイプ演算子の価値と今後の参加
- constructor property promotion などと並ぶ高コストパフォーマンス機能
- 記述の簡潔化、可読性・保守性の向上
- PHP開発の推進に スポンサーとしての参加 も呼びかけ