PHP 8.5のパイプ演算子をLaravelで使ってみた!一時変数だらけの整形処理がかなり読みやすくなった話
🙌 結論から
PHP 8.5 のパイプ演算子 |> は、「関数を順番に通すだけの整形処理」を書くときにかなり便利です!
PHP 8.5 自体は 2025年11月20日にリリースされていて、2026年9月24日には 8.5.11 が出ています🚀
私はしばらく「新しい構文は様子見でいいかな・・・」と思っていました。
ただ、検索キーワードの正規化みたいな処理を書き直してみたら、$value = ... の上書きが並ぶコードがスッと一本の流れになったんですよね(^o^)
一方で、Laravel には Str や Collection のメソッドチェーンがもともとあるので、何でもパイプにすればいいわけではないとも感じました( .. )
💡 一時変数の上書きが消えた
|> は、左の値を右の関数(callable)に1つだけ引数として渡す演算子です。
たとえば、検索フォームのキーワードを整えるコードは、今までこんな感じで書いていました。
$keyword = $request->input('q', '');
$keyword = trim($keyword);
$keyword = mb_strtolower($keyword);
$keyword = preg_replace('/\s+/u', ' ', $keyword);
パイプ演算子で書き直すとこうなります。
$keyword = $request->input('q', '')
|> trim(...)
|> mb_strtolower(...)
|> (fn (string $s) => preg_replace('/\s+/u', ' ', $s));
trim(...) は PHP 8.1 からある第一級 callable 構文です。
上から下に読むだけで処理の順番が分かるので、レビューのときにかなり楽・・!👍
入れ子で preg_replace(..., mb_strtolower(trim($keyword))) と書くより、ずっと追いやすいです!
🔥 最初につまずいたエラーたち
正直、最初は3回くらい怒られました(・_・;)
1つ目は、アロー関数を括弧で囲まなかったときです。
Fatal error: Arrow functions on the right hand side of |> must be parenthesized
fn を右辺に書くときは、必ず ( ) で囲む必要があります。
文法のあいまいさを避けるための決まりなので、慣れるしかないですね🤔
2つ目は、引数が2つ以上必要な関数をそのまま渡したときです。
|> は値を1つしか渡さないので、ArgumentCountError: Too few arguments になります(T_T)
str_replace() や explode() のように引数が複数ある関数は、アロー関数で包んで1引数にしてから渡しています。
3つ目は、参照渡しの関数です。
パイプの途中の値は変数に入っていないので、参照渡しの引数を持つ関数は Argument #1 ($a) could not be passed by reference というエラーで弾かれます。
配列を並べ替える sort() 系は参照渡しなので、パイプの中では使えないんですよね・・・!
このあたりは php-src のテストコードにそのままエラーメッセージが書いてあったので、困ったらそこを見るのが早かったです🔥
🤔 Laravel の Str や Collection とはこう使い分けてます
さっきのキーワード整形は、実は Laravel なら Str でも書けます。
$keyword = Str::of($request->input('q', ''))->trim()->lower()->squish();
これはこれで十分読みやすいので、文字列だけで完結するなら今も Str を使っています。
配列も同じで、map や filter が続く処理は collect() のほうが素直です!
私がパイプ演算子を使うのは、次のようなときです。
- PHP の標準関数と自作の関数が混ざる処理
StrやCollectionに変換するほどでもない、2〜3ステップの整形- 自作の小さな関数(正規化・マスク処理など)を順番に通したいとき
「Laravel のメソッドチェーンが使えない場所で、一時変数を減らす道具」くらいの位置づけが、今のところしっくりきてます( ˘ω˘ )
👀 入れる前に確認しておきたいこと
ここは本当に重要です。
Laravel 13(手元で確認した v13.33.0)の composer.json は "php": "^8.3" なので、フレームワーク側は PHP 8.3 でも動きます。
つまり、アプリ側で |> を書いたら、自分の composer.json の PHP 要件も ^8.5 に上げておかないと、8.3 や 8.4 のサーバーで構文エラーになります。
本番・ステージング・CI の PHP バージョンがそろっているかは、先に確認したほうがいいです💪
静的解析は、PHPStan が PHP 8.5 に対応済みで、パイプ式も普通の関数呼び出しと同じように型チェックしてくれます✅
型の崩れにも気づけるので、ここはかなりありがたいです(^^)
パパ系Webエンジニア〜愛用ガジェット一覧 🛍️
この記事を書いている作業環境のガジェットを楽天ROOMにまとめています ✨ 在宅エンジニアのデスク作りの参考にどうぞ 🙌
👍 まとめ
PHP 8.5 のパイプ演算子は、一時変数の上書きが続く整形処理を一本の流れにしてくれる、ちょうどいいサイズの新機能でした。
アロー関数の括弧・1引数・参照渡しの3つさえ押さえておけば、ハマりどころはそれほど多くないです!
Laravel なら Str や Collection で書ける所はそのままにして、はみ出す所だけパイプにする、くらいがいい塩梅かも・・・!
PHP 8.5 に上げたタイミングで、一時変数だらけの関数を1つ書き直してみると違いが分かりやすいと思います😊
※ バージョン番号・料金・機能は今後も変わる可能性があります。最新情報は公式サイトをご確認ください👀