PHP 8.5 パイプ演算子 vs Laravel Collections
PHP 8.5でパイプ演算子が導入されました。ほとんどのLaravel開発者はこれを無視してきました。私たちは長年 collect()->filter()->map() を使用してきました。それで十分に機能します。
その後、SpatieがPiperをリリースしました。これは、パイプ演算子にLaravelスタイルのヘルパーをもたらすライブラリです。配列や文字列に対してスタンドアロンの関数を使用します。
PiperはCollectionsの代わりになるものか? いいえ。目的が異なります。
Piperが優れている点
• ネイティブな値。Collectionsはデータをオブジェクトでラップします。そのため、配列をCollectionsに変換し、また元に戻す必要があります。Piperはプレーンな配列や文字列で動作します。データはネイティブな形式で入力され、ネイティブな形式で出力されます。
• 関数の混在。Collectionのチェーンは、Collectionクラスのメソッドしか呼び出せません。一方、パイプのチェーンはあらゆる関数を受け入れます。Piperのヘルパー、PHPのネイティブ関数、そして独自のカスタム関数を一つのフローの中で混在させることができます。
• 依存関係ゼロ。PiperはLaravelフレームワークを必要としません。そのため、重い依存関係なしにクリーンなコードを書きたいパッケージ開発者にとって最適です。
Collectionsが優れている点
• 機能の深さ。Collectionsには groupBy() や pluck() など、100以上のメソッドがあります。Piperには最も一般的なものしかありません。
• 遅延評価(Lazy evaluation)。LazyCollectionsは、メモリ消費を抑えながら大規模なデータセットを処理できます。Piperはステップごとに新しい配列を作成します。これは、大量のデータを扱う際にアプリの速度を低下させる可能性があります。
• エコシステムへの適合性。EloquentはCollectionsを返します。クエリビルダーもCollectionsを返します。Piperを使うためにフレームワークと戦うことは、多くの場合、余計な手間を生むことになります。
• 発見しやすさ(Discoverability)。Collectionの後に -> を入力すると、IDEがすべてのメソッドを表示してくれます。Piperの場合、すべての関数を手動でインポートする必要があります。
大きな落とし穴
PHP 8.5を実行している必要があります。ほとんどのプロダクションサーバーは、まだ8.2または8.4で動作しています。もし8.5を使用していないのであれば、現時点ではPiperは役に立ちません。
導入のアドバイス
パッケージやフレームワークに依存しないコードを書く場合は、Piperを使用してください。オブジェクトのオーバーヘッドなしに、ネイティブな配列を変換したい場合に適しています。
Laravelアプリ内ではCollectionsを使い続けましょう。それらは統合されており、強力で、チームが期待するものです。
Piperは代わりになるものではありません。プロジェクト間の隙間を埋めるためのツールです。
