※本コラムは2024年4月に執筆いただいたコラムになります。内容もその時点のものになりますので、ご注意ください。
例年通り、PHPの開発も、秋のリリースに向けて、次のマイナーバージョンであるバージョン8.4の開発が開始されています。今回の記事では、導入予定の機能の一部を紹介します。
PHP 8.4リリースに向けて
PHP 8.4はPHP 8における4回目のマイナーバージョンアップになり、基本的な機能に関する変更点はありませんが、より使いやすくするという意味での改良が行われる予定です。今後、リリースのマネジメントを行うリリースマネージャの選定が行われます。リリースマネージャは、ベテラン1名とルーキー2名の合計3名がPHP開発者による選挙で選出されます。選挙は4月1日から15日まで行われる予定です。
その後、アルファ版のリリースが6月6日から行われ、7月16日にフィーチャーフリーズ、7月18日からベータ版がリリースされる予定です。8月29日からリリース候補版が2週間毎にリリースされ、順調にいけば今年の11月21日にPHP 8.4がリリースされます。
PHP 8.4に関する機能は現時点で未確定ですが、RFC(変更提案)ですでにPHP 8.4向けの提案が採択され、開発レポジトリに実装されている主な変更点を以下に示します。
- DOMエクステンションの強化
- 新しいDOM規格に対応したクラスが導入されます。
- HTML5のパースができるようになります。
- mbstringエクステンションの機能強化
- 空白文字等を削除するmb_trim、mb_ltrim、mb_rtrim関数が追加されます。
- 先頭文字を大文字・小文字にするmb_ucfirst、mb_lcfirst関数が追加されます。
- HTTPコンテンツ取得時のHTTPヘッダ取得用関数の追加
- http_get_last_response_headers関数が追加されます。
- multipart/form-data形式におけるPOST以外のパラメータ取得
– PUT/PATCHのようなPOST以外のHTTPフォーム投稿に対応します。 - IRフレームワークに基づく新しいJIT
– PHP 8で追加されたJIT機能の実装が中間コードを利用する形に変更されます。
これらの変更点について、今回以降紹介していきたいと思います。なお、PHP 8.4で導入される機能はまだ変更される可能性があり、紹介する内容も最終的なものと異なる可能性があることに注意してください。
DOMエクステンションの強化
PHPでは、従来からDocument Object Model (DOM)によるデータ表現および操作がサポートされています。DOMは、XMLやHTML文書などのマークアップ言語やCSSをプログラミング言語からアクセスするためのAPIです。このAPIにより、XMLやHTMLの構造をDOMツリーと呼ばれるツリー構造のオブジェクトとして定義し、プロパティを追加したり、値を変更することができます。PHPでは、DOM コアレベル3をサポートしており、妥当性検証も可能です。現在、HTMLおよびDOMの仕様は、Living StandardとしてWeb Hypertext Application Technology Working Group (WHATWG)により管理されています。HTMLがHTML5となり、関連するDOMの仕様も随時改訂されていますが、PHPのDOMエクステンションでは残念ながらサポートされていません。現在では、Google Chrome、Edgeなどの主要なWebブラウザにおいてHTML5がサポートされており、DOMにおけるサポートも必要となっています。
PHP 8.4では、DOMを扱う新たなクラスとして DOM\Document、DOM\XMLDocument、DOM\HTMLDocument が導入されます。従来のDOMDocumentクラスは引き続き利用可能ですが、新しいクラスを利用することで、HTML5ファイルの読み込みや出力などが可能となります。importLegacyNodeメソッドにより、従来のDOMノードのインポートも可能です。
では、HTML5ファイルの読み込みと更新をDOM APIにより実行してみましょう。まず、以下に示すHTML5形式の簡単なファイル(sample.html)を用意します。
<!DOCTYPE html><html lang="ja"><head>
<meta charset="UTF-8">
<title>サイトのタイトル</title>
</head>
<body>
<div id="id1">サイトの本文</div>
</body></html>
PHP 8.4の開発版で以下のPHPスクリプトを実行してみましょう。
<?php
$document = \DOM\HTMLDocument::createFromFile('sample.html');
$document->getElementsByTagName('title')->item(0)->textContent
= '変更後のタイトル';
$document->getElementById('id1')->textContent = '変更後のコンテンツ';
$document->getElementById('id1')->setAttribute('attr', 'value');
$document->saveHTMLFile('revised.html');
2行目で、HTMLDocumentクラスのスタティックメソッドcreateFromFileにより既存のHTML5ファイルを読み込みます。HTML5ファイルをDOM APIにより一から作成することも可能ですが、手間を考えると通常はテンプレートを用意してDOMツリーとして読み込んだうえで必要な部分のみ更新する手法が用いられます。次に4行目でgetElementsByTagNameによりタイトル(title)のノードを取得し、HTMLファイルのタイトルを更新します。更に、6行目で、idがid1の要素を取得し、内容を書き換えます。また、setAttributeにより、属性(attr)とその値(value)を設定します。最後に、saveHTMLFileメソッドでHTMLファイルを保存します。
このスクリプトを実行すると、以下のHTML5形式のファイル(revised.html)が生成されます。
<!DOCTYPE html><html lang="ja"><head>
<meta charset="UTF-8">
<title>変更後のタイトル</title>
</head>
<body>
<div id="id1" attr="value">変更後のコンテンツ</div>
</body></html>
HTMLファイルのタイトルおよびidがid1のコンテンツが更新され、属性が追加されていることがわかります。W3Techsによると、Webサイトで公開されているHTMLの97%がHTML5となっており、PHP 8.4で導入される新たなDOM APIによりHTML5をパース、生成できるようになることが期待されます。
mbstringエクステンションの機能強化
マルチバイト文字を扱うmbstringエクステンションに、いくつかの有用な関数が追加されます。
- 文字列の先頭と末尾から余計な空白文字を削除するtrim関数のマルチバイト文字対応版として、mb_trim関数が追加されます。また、文字列の先頭、末尾のどちらかのみの空白文字を削除するmb_ltrim、mb_rtrim関数も追加されます。
- 文字列の先頭を大文字または小文字にする関数(ucfirstおよびlcfirst)のマルチバイト文字対応版として、mb_ucfirst、mb_lcfirst関数が追加されます。
PHP標準のtrim関数は、空白に加えて、タブや改行文字などを取り除きます。trim関数はシングルバイト文字にのみ対応しており、全角スペースを削除することはできません。このため、従来は、mb_convert_kana($str, “s”, “UTF-8”) のように mb_convert_kana関数を用いて、全角スペースを半角スペースに変換した後で、trim関数を適用する必要がありました。
<?php
$str = ' あ';
var_dump(trim($str, ' ')); // 文字化け
var_dump(trim(mb_convert_kana($str,"s"))); // 'あ'
2行目の文字列は先頭に全角スペースが含まれています。この文字列にtrim関数を適用し、全角スペースを第二引数に指定して削除すると、シングルバイト文字として処理されるため、文字列が破壊されて、文字化けしてしまいます。4行目では、mb_convert_kanaにより全角スペースを半角スペースに変換した後でtrim関数を適用しており、意図したとおりに先頭の空白文字が削除されます。PHP 8.4から新たに導入されるmb_trim関数を用いると、以下のように簡単に全角空白文字を削除することができます。
<?php
$str = ' あ';
var_dump(mb_trim($str, ' ')); // 'あ'
var_dump(mb_trim($str)); // 'あ'
次に、文字列の先頭文字を大文字(または小文字)にするucfirst(lcfirst)関数のマルチバイト文字対応版を紹介します。ucfirst関数はシングルバイト文字にのみ対応しており、マルチバイト文字を入力しても文字列は変更されません。以下に簡単な例を示します。
<?php
var_dump(ucfirst('hello')); // 'Hello'
var_dump(ucfirst('hello')); // 'hello'
シングルバイト文字列(hello)は先頭が大文字に変換(Hello)されていますが、マルチバイト文字列(hello)は変換されていないことがわかります。
次にPHP 8.4で新たに導入される mb_ucfirst 関数を利用してみましょう。
<?php
var_dump(mb_ucfirst('hello')); // 'Hello'
出力は「Hello」となり、マルチバイト文字においても正しく先頭文字が大文字に変換されていることがわかります。従来、このような処理は先頭文字を切り出して変換するような煩雑な処理が必要でしたが、mb_ucfirst関数の導入により簡単に変換を行うことができるようになります。
今回は、11月のリリースに向けて開発が開始されたPHP 8.4における変更点の一部を紹介しました。DOM APIがHTML5に対応し、空白文字の削除や先頭文字の変換を行う関数がマルチバイト対応となることで、PHPの利便性が向上することが期待されます。次回以降もPHP 8.4のその他の変更点について紹介していきます。