PHP8.5の新機能

みなさん、こんにちは。
昨年11月にPHPの最新バージョンであるPHP8.5がリリースされましたね。
私も普段の開発業務では主にPHPを使用しており、これから新規開発で使用される機会も増えていくだろうと思っています。
ところで、バージョンアップデートということは、これまでにはなかった新機能なども多数追加されています。
今回は、その中でも私が特に気になった、新たな配列操作関数array_first()とarray_last()についてご紹介したいと思います。
array_first
array_first()は配列の先頭要素を取得する関数です。あまりに単純すぎて、「なぜ今更そんなものが?」と思われるかもしれません。
そもそも、「配列の先頭要素を取得する」という操作はプログラミングにおいて頻出で、PHPでもこの操作を行う方法はすでにいくつもあります。
簡単なものを以下に示します。

単純なリストであればインデックスを指定すれば取得できます。
また連想配列の場合も

このようにarray_values()でリストに変換するか、array_key_first()で先頭のキーを取得してしまえば問題ありません。
しかし、これらの方法は$arrayが空配列だった場合はエラーになってしまいます。
要素の取得前に空配列かどうかをチェックすれば良いと思われるかもしれませんが、配列操作のたびにチェックを挟むと、複雑な処理での可読性の低下も無視できないものとなります。
そのため、上記の方法は要素が存在することが自明である場合に用い、それ以外では、空配列が渡された場合に特定の値を返す関数を使う方がシンプルになります。

$arrayが空配列の場合、array_shift()はnull、reset()はfalseを返します。そして、空配列でない場合は先頭の要素を取得します。
配列の中身を気にせず使うことができ、array_shift()やreset()はarray_first()に求められる動作をほぼ満たしていると言えます。
一方で、これらの関数にも弱点が存在します。それは、「要素の取得以外に作用があること」、「引数が参照渡しであること」です。
array_shift()は配列から先頭要素を抜き出すため、元配列は要素一つ分短くなります。reset()は内部のポインタを先頭要素に移動します。
つまり、これらの関数は取得と同時に、配列に対して破壊的操作を伴います。また、引数が参照渡しであるため、関数の戻り値を直接渡した場合は、基本的にエラーになります。
今回追加されたarray_first()は上記の方法の「良いとこどり」の動作をします。
渡された配列が空である場合はnullを返し、そうでない場合は先頭の要素を返します。
リファレンスを渡す必要がなく、引数に対してイミュータブルな関数です。
関数名から動作がわかりやすいのもポイントで、まさに痒いところに手が届く関数と言えるでしょう。
array_last
array_last()はarray_first()の逆で、末尾の要素を取得します。
この関数もすでに同じ操作を行う方法が複数ありますが、上に書いたように、それぞれにメリットとデメリットがあります。

末尾の要素を取得する操作は、先頭要素を取得する操作に比べて、コードや関数の名前がわかりにくくなりやすいです。
array_last()も、array_first()と同様のメリットがあるため、ぴったりの使いどころが出てくるでしょう。
今回はPHP8.5の新機能array_first()とarray_last()について解説しました。
似たような関数でも細かい仕様の違いがあり、思ったよりも長々と書いてしまいましたが、いかがだったでしょうか。
PHP8.5では他にも多くの新機能が追加されており、特にパイプ演算子の導入などは、続くPHP8.6の関数部分適用の追加と相まって、かなり自由度の高いコーディングができるようになると感じています。
これからもアップデートされていくPHPについて、この記事で興味を持ってもらえれば幸いです。
最後までお読みいただき、ありがとうございました。

