本連載においては,PHP界隈の最新情報を紹介しています.昨年11月のPHP 8.5のリリースの後,本コラムも少しお休みしていましたが,次のマイナーバージョンアップである PHP 8.6の開発の方向が見えてきましたので,紹介していきたいと思います.
PHP 8.6開発の流れと体制
2026年4月にPHP のリリースプロセスをまとめるリリースマネージャがPHP開発者による選挙により選ばれました.リリースマネージャは,ベテラン1名とルーキー2名からなり,ベテランは前のバージョンであるPHP 8.5のルーキーから選ばれます.また,ルーキーは新たに候補者から選ばれます.ルーキー2名が実質的なリリース作業を主に行い,ベテランがリリースプロセスのマネジメントを主に行います.選挙の結果,ベテランにはDaniel Scherzer,ルーキーにはMatteo BeccatiとJoe Fergusonが選ばれました.
今後,7月からα版のリリースが2週間毎に3回行われた後,8月13日にフィーチャーフリーズが宣言される予定です.フィーチャーフリーズは,リリースに入る新機能や変更点が決まることを意味し,この後は,新たな機能や変更は原則として行われず,機能の安定化・バグ修正が主に行われます.その後,β版のリリース,リリース候補版のリリースが行われ,順調にいけば,11月19日にPHP 8.6の正式リリースが行われる予定です.
PHP 8.6の新機能と変更点
PHP は,より使いやすいスクリプト言語となるべく,言語機能の強化を進化させつつ,スクリプトエンジンの高速化を図っています.PHP 7で内部的なデータ構造の見直しにより実行速度を大幅に改善し,PHP 8ではJITコンパイラの導入により,更に実行速度を向上させています.
PHPの新たな機能の導入プロセスにおいては,RFCと呼ばれる仕組みにより提案され,投票により採択が決まる仕組みとなっており,PHP 8.6においてもいくつかの機能がすでに提案されています.PHP 8系もすでに8.5までがリリースされており,機能的にはすでに成熟段階にあるため,PHP 8.6で新たに導入される機能は比較的小規模になると思われます.既に提案されている機能の中では,「部分適用 (partial function)」と呼ばれる機能があり,本リリースの目玉になると思われます.部分適用については,開発用レポジトリに現在実装中のため,次回以降に紹介することとし,今回は実装が完了している変更点についていくつか紹介します.
マルチバイト対応正規表現Mbregexが廃止される
PHP では,日本語を含むマルチバイト文字に対応した正規表現を使うことが可能です.サポートされている方法は2種類あり,Perl互換正規表現(PCRE)でサポートされるUnicode対応正規またはmbstringに付属するマルチバイト文字対応正規表現mbregexを使用します.前者(PCRE)は,PHP本体に組み込まれているため,PHPの構築環境や設定によらず利用することが可能です.一方,後者(mbregex)は,PHPの構築または設定時にmbstringの組込みとmbregexの有効化が必要ですが,Shift_JISのようなUnicode (UTF-8)以外の文字エンコーディングやPOSIX系正規表現にも対応している特徴があります.
Mbregexにおける正規表現エンジンは,Ruby向けに開発されたOniguruma(鬼車)を利用しています.しかし,Onigurumaの開発は,2025年4月24日で終了が宣言されており,公開はアーカイブとして継続されるものの,今後のメンテナンスも行われない見込みです.このため,Onigurumaを利用するmbregexにおいてもセキュリティ対策を含むメンテナンスが困難となることが想定されます.
こうした経緯を受けて,PHP本体におけるmbregexのサポートを廃止することが提案され,投票の結果,廃止が決定されました.今後,mbregexがサポートする機能については,PHP 8.6で非推奨化され,PHP 9で廃止されます.
mbregexが提供するmb_ereg,mb_ereg_replaceなどの正規表現関数については,PHP 4の時代から長く提供され,日本語対応のWebアプリケーションではいまだに使われている事例があります.このため,PHP 9に向けては,代替策について検討していく必要があります.主な代替策には以下の2種類があります.
- PCREに変更する
アプリケーションの処理でUnicode (UTF-8)文字列を用いているか文字エンコーディングを変換可能である場合,PCREのUnicode対応正規表現関数を使用することができます.例えば,以下の正規表現にマッチする文字列を置換する mbregexエクステンションの関数mb_ereg_replaceの利用例を見てみましょう.
<?php
$data = "Hello, World!";
echo mb_ereg_replace("[^A-Za-z0-9]","",$data);
ここでは, 正規表現により変数$dataに含まれる英数字以外の文字を削除しています.
この例をPCREの同等の関数(preg_replace)で置き換えると以下となります.
<?php
$data = "Hello, World!";
echo mb_ereg_replace("[^A-Za-z0-9]","",$data);
正規表現は同じですが,PCREの場合は正規表現をセパレータ(/…/)で括る必要があります.末尾のuはUnicodeにマッチさせるための修飾子です.
- サードパーティ製のエクステンションを利用
mbregexエクステンションと同等の機能をサポートするエクステンションmb_onigを利用します.mb_onigは,githubで公開 (https://github.com/youkidearitai/mb_onig/) されています.通常のエクステンションと同様にソースコードをコンパイルすることが可能です.PHP本体に組み込む場合は,以下のように configureに --enable-mb_onigオプションを指定します.この後,make (nmake)でコンパイルすると PHP が構築されます.
cd php-src/ext
git clone https://github.com/youkidearitai/mb_onig
buildconf
configure --enable-mbstring –disable-mbregex --enable-mb_onigこのエクステンションでは,Unicodeのバージョンおよびセキュリティ関連の更新のみを適用したOnigurumaを用いており,安全に使用することが期待できます.
これらの2種類の選択肢を組み合わせることも可能で,例えば,新規開発のコードではPCREエクステンション(または後述するintlエクステンション)を用い,既存のコードを動作させるために暫定的にmb_onigエクステンションを利用し,移行の手間を減らすことが考えられます.
Unicode書記素の文字列反転関数が追加
PHP 8.6では,自然言語および文字エンコーディングに関する処理を行うintlエクステンションに書記素クラスター単位で文字列を反転させるgrapheme_strrev関数が追加されます.Unicodeの絵文字や異体字セレクタなどを含む文字列を反転させることができます.絵文字を含む文字列を反転させる例を見てみましょう.通常のstrrev関数では文字列を壊してしまいますが,grapheme_strrev関数を用いることで正しく処理を行うことができます.
echo grapheme_strrev("αあいうえお👨👨👧👦")
出力は以下となり,絵文字を崩すことなく,文字列が反転できていることがわかります.
"👨👨👧👦おえういあα"
今回は、次期マイナーバージョンであるPHP 8.6のリリースおよび開発体制の立上げに関する情報と,想定される変更点のいくつかを紹介しました.今回紹介した変更点も含めて,フィーチャーフリーズまでは変更が行われる可能性があることに注意してください.次回以降もPHP 8.6の新たな機能や変更点について紹介していく予定です.



