はじめに
PHP 8.5からパイプ演算子が導入されたので、どんな使い方ができるのか試してみました。
パイプ演算子とは
PHP 8.5 以降では、callable に直接値を渡す演算子をサポートしています。 |> 演算子、または "パイプ" は、右辺にパラメーターをひとつ取る callable を受け入れ、左辺値をそれに渡し、callable の結果を評価します。 右辺の callable は、有効な PHP の callable であれば何でも構いません: つまり、Closure、 第一級callableを生成する記法、 __invoke() を実装したオブジェクトなどです。
説明文だけだとイメージしづらいので、動かしてみます。
文字列を大文字に変えてトリムする
- パイプ演算子
$str = ' test '
|> strtoupper(...)
|> trim(...);
echo $str; // TEST
※関数は(...)を使って第一級callableとして扱う必要があります
- 今までの書き方
$str = ' test ';
$str = strtoupper($str);
$str = trim($str);
echo $str; // TEST
パイプ演算子の方は初見だと何をしているのかわかりづらかったですが、今までの書き方と比べるとやっぱりスッキリします。
複数の引数を持つ関数を使いたい場合
先ほどの例では関数が持つ引数は全て1つだけでした。
引数を複数持つ関数の場合はアロー関数でどの引数に値を渡すか指定する必要があります。
$str = ' test '
|> strtoupper(...)
|> trim(...)
|> (fn ($str) => str_replace('TEST', 'test', $str));
echo $str; // test
※アロー関数を利用する場合は()で囲わないと構文エラーになります
アロー関数が必要になるので、その分可読性が落ちてますが、どうやらPHP 8.6からは部分適用が追加される見込みで、その場合はアロー関数が不要になります。
部分適用を使用した場合
$str = ' test '
|> strtoupper(...)
|> trim(...)
|> str_replace('TEST', 'test', ?); // ? に値が設定されます
echo $str; // test
部分適用が利用できるようになるとスッキリすることがわかります。
さいごに
部分適用が始まれば、よりパイプ演算子の書き方が主流になりそうなので、今のうちに慣れておいて損はなさそうです。