関数の機能強化
さまざまな関数の機能強化および追加が実施されました。
round関数の丸めモードのENUM化と追加
PHP 8.4では、round関数における丸めモードの指定を、定数の代わりにENUM値で指定できるようになりました。従来はPHP_ROUND_HALF_UPなどの定数で指定していたところを、RoundingMode::HalfAwayFromZeroなどのENUM値で指定できるようになり、意味も分かりやすくなって、コードの可読性がアップします。また、丸めモードも新たに4つ追加されました。
// PHP_ROUND_HALF_UP、端数が5の場合0から離れる方向に丸める var_dump(round(1.25, 1, RoundingMode::HalfAwayFromZero)); // float(1.3) // PHP_ROUND_HALF_DOWN、端数が5の場合0に近づく方向に丸める var_dump(round(1.25, 1, RoundingMode::HalfTowardsZero)); // float(1.2) // PHP_ROUND_HALF_EVEN、端数が5の場合最も近い偶数に丸める var_dump(round(1.25, 1, RoundingMode::HalfEven)); // float(1.2) // PHP_ROUND_HALF_ODD、端数が5の場合最も近い奇数に丸める var_dump(round(1.25, 1, RoundingMode::HalfOdd)); // float(1.3) // PHP 8.4で追加:0に近づける切り捨て var_dump(round(-1.23, 1, RoundingMode::TowardsZero)); // float(-1.2) // PHP 8.4で追加:0から離れる切り上げ var_dump(round(-1.23, 1, RoundingMode::AwayFromZero)); // float(-1.3) // PHP 8.4で追加:切り捨て var_dump(round(-1.23, 1, RoundingMode::NegativeInfinity)); // float(-1.3) // PHP 8.4で追加:切り上げ var_dump(round(-1.23, 1, RoundingMode::PositiveInfinity)); // float(-1.2)
リクエストボディの取得関数request_parse_body
PHP 8.4では、リクエストボディの取得のためのrequest_parse_body関数が使えるようになりました。従来は、POSTメソッドに限り$_POST変数にリクエストボディが入ってきましたが、GETメソッド、PUTメソッドには対応せず、これらには特別な処理が必要でした。
これが、メソッドに関係なくリクエストボディを取得できるようになります。request_parse_body関数の戻り値は2要素の配列で、最初の要素が$_POSTに、次の要素が$_FILESにそれぞれ対応するので、受け取ったあとの処理は従来と同様です。
[$_POST, $_FILES] = request_parse_body();
絵文字分割関数grapheme_str_split
PHP 8.4では、文字列が書記素クラスタからなる絵文字を含む場合でも正しく分割できる、grapheme_str_split関数が使えるようになりました。
例えば、国旗や家族を表す絵文字は、書記素クラスタで構成されます。このような絵文字は、従来のstr_split関数はもちろんのこと、mb_str_split関数でも期待通りに分割できませんでした。grapheme_str_split関数を使うと、書記素クラスタが認識されて正しく分割されるようになります。
// 書記素クラスタがサポートされない環境では「JPUS」と表示される var_dump(str_split("🇯🇵🇺🇸")); var_dump(mb_str_split("🇯🇵🇺🇸")); var_dump(grapheme_str_split("🇯🇵🇺🇸"));
実行すると、以下のようになります。
array(16) { // 1個目のvar_dump [0]=> string(1) " " // そもそも正しく認識されない [1]=> string(1) " " …略… } array(4) { // 2個目のvar_dump [0]=> string(4) "🇯" // 日本の国旗が分かれている [1]=> string(4) "🇵" …略… } array(2) { // 3個目のvar_dump [0]=> string(8) "🇯🇵" // 正しく分割される [1]=> string(8) "🇺🇸" }
[NOTE]書記素クラスタ
書記素クラスタ(grapheme cluster)とは、Unicodeの複数のコードポイントからなる文字単位を指します。簡単に言うと、単一のコードポイントでは表現できない文字を、2つ以上のコードポイントで表現する方式の規格です。例えば、国旗の絵文字は単一のコードポイントでは表現できず、日本の国旗はU+1F1EFとU+1F1F5の組み合わせで表現されます。
マルチバイト版関数mb_trim/mb_ltrim/mb_rtrim/mb_ucfirst/mb_lcfirst
PHP 8.4では、trim関数、ltrim/rtrim関数/ucfirst関数/lcfirst関数のマルチバイト対応版関数として、mb_trim/mb_ltrim/mb_rtrim/mb_ucfirst/mb_lcfirstを使えるようになりました。マルチバイト文字列端の全角スペースを削除したり、先頭文字の大文字/小文字化が可能になります。
ただし、mb_ucfirst/mb_lcfirstは内部的にはmb_strtoupper/mb_strtolowerと同じなので、日本語の拗促音には対応しません。
// 前端に全角スペース、後端に半角スペース print(trim(' あいう ') . "行末\n"); // " あいう行末 print(mb_trim(' あいう ') . "行末\n"); // "あいう行末" // 全角英文字、ギリシャ文字などに対応する print(ucfirst('αβγ') . "\n"); // αβγ print(mb_ucfirst('αβγ') . "\n"); // Αβγ // 日本語の拗促音には対応しない print(mb_ucfirst('ょ') . "\n"); // ょ
HTTPレスポンスヘッダを取得/消去する関数http_get_last_response_headers/http_clear_last_response_headers
PHP 8.4では、HTTPアクセスの結果であるレスポンスヘッダを取得する関数http_get_last_response_headers関数を使えるようになりました。file_get_contents関数で取得した最新のコンテンツから、ヘッダ部分のみを取得する関数です。
http_clear_last_response_headers関数は、取得済みのヘッダを消去します。従来は、$http_response_header変数が生成されて保持されていたのが、関数で取得するようになったわけです。$http_response_headerも従来通り利用できます。
file_get_contents('https://naosan.jp/'); var_dump(http_get_last_response_headers()); var_dump($http_response_header); var_dump(http_clear_last_response_headers());
実行結果は以下のようになります。
array(8) { // 1回目のvar_dump [0]=> string(15) "HTTP/1.1 200 OK" …略… array(8) { // 2回目のvar_dump(1回目と同じ) [0]=> string(15) "HTTP/1.1 200 OK" …略… NULL // 3回目のvar_dump
IEEE754準拠のべき乗関数fpow
PHP 8.4では、べき乗を計算する算術演算関数fpowを使えるようになりました。第5回で、0のマイナス乗を計算するときの動作の変更について紹介しましたが、IEEE754に準拠した従来の動作の代替となる関数となっています(fmod関数と同様の位置付けです)。
つまり、0の負数によるべき乗を計算した際に無限大(float(INF))が演算結果となります(**演算子を使った0の負数によるべき乗はDeprecatedとなっている)。
var_dump(fpow(2, 2)); // float(4) var_dump(fpow(0, -2)); // float(INF) var_dump(fpow(-1, 1.5)); // float(NAN)
配列検索関数array_find/array_find_key/array_any/array_all
PHP 8.4では、array_find/array_find_key/array_any/array_all関数により配列の検索がより便利になりました。それぞれ、引数に対象の配列と条件判断関数のcallableを受け取り、以下の結果を返します。
- array_find:一致する最初の値を返す
- array_find_key:一致する最初のキーを返す
- array_any:一つでも当てはまる要素があるかチェックする
- array_all:全ての要素が当てはまるかチェックする
$array = [ '1' => 'Mie', '2' => 'Saga', '3' => 'Chiba', '4' => 'Toyama', '5' => 'Tochigi', '6' => 'Kanagawa', '7' => 'Fukushima' ]; var_dump(array_find($array, function (string $value) { return strlen($value) > 5; })); // string(6) "Toyama" var_dump(array_find_key($array, function (string $value, $key) { return preg_match('/^\d$/', $key); })); // int(1) var_dump(array_any($array, function (string $value) { return preg_match('/^N.+/', $value); })); // bool(false) var_dump(array_all($array, function (string $value, $key) { return is_numeric($key); })); // bool(true)
まとめ
今回は、PHP 8.4の新機能のうち、処理系の強化内容と、DOMの処理を目的とした機能や、関数の強化・改良ポイントを紹介しました。
PHPでは、このように非常に細かな改変が各バージョンで施されています。よりモダンで使い勝手のよい言語として成長し続けるPHPを、今後も見守っていきたいものです。