SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ますます便利になるPHPの新機能を探ろう!

より使いやすくなったPHP 8.4の新機能──処理系とDOM処理・関数の強化ポイント

ますます便利になるPHPの新機能を探ろう! 第6回

  • X ポスト
  • このエントリーをはてなブックマークに追加

関数の機能強化

 さまざまな関数の機能強化および追加が実施されました。

round関数の丸めモードのENUM化と追加

 PHP 8.4では、round関数における丸めモードの指定を、定数の代わりにENUM値で指定できるようになりました。従来はPHP_ROUND_HALF_UPなどの定数で指定していたところを、RoundingMode::HalfAwayFromZeroなどのENUM値で指定できるようになり、意味も分かりやすくなって、コードの可読性がアップします。また、丸めモードも新たに4つ追加されました。

リスト round.php
// 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関数を使うと、書記素クラスタが認識されて正しく分割されるようになります。

リスト grapheme.php
// 書記素クラスタがサポートされない環境では「JPUS」と表示される
var_dump(str_split("🇯🇵🇺🇸"));
var_dump(mb_str_split("🇯🇵🇺🇸"));
var_dump(grapheme_str_split("🇯🇵🇺🇸"));
図 grapheme.phpのコード(VS Code)
図 grapheme.phpのコード(VS Code)

 実行すると、以下のようになります。

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) "🇺🇸"
}
図 grapheme.phpの実行結果(VS Code)
図 grapheme.phpの実行結果(VS Code)

[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と同じなので、日本語の拗促音には対応しません。

リスト multibyte.php
// 前端に全角スペース、後端に半角スペース
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も従来通り利用できます。

リスト http.php
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となっている)。

リスト fpow.php
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.php
$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を、今後も見守っていきたいものです。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ますます便利になるPHPの新機能を探ろう!連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/20787 2025/01/24 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング