SHOEISHA iD

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

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

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

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

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

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

処理系の強化

 処理系には、主に高速化を意図した変更が加えられています。

新しいJITコンパイラ

 PHP 8.4では、中間表現を用いた新たなJITコンパイラの実装により、コンパイルと実行がより高速になりました。PHPの最適化は8.0から始まりましたが、それはZend仮想マシンのバイトコードから直接ネイティブコードを生成するものでした。これには最適化に制約が加わることになり、これを解決するのが中間表現(IR; Intermediate Representation)です。

図:新しいJITコンパイラ
図:新しいJITコンパイラ

 中間表現は、IRフレームワークによりプラットフォームに依存しない形で生成され、そこから最適化、レジスタ割り当て、スケジューリング、ネイティブコード生成に移行します。つまり二段構えでPHPコードがネイティブコードに変換されます。

 従来のJITに比較して5~10%高速になり、ネイティブコードのサイズは少し小さくなるようです。

JIT無効化の簡便化

 PHP 8.4では、JITを無効化する際の設定がより簡便になりました。従来は、以下のリストのようにJITを無効化していました。

opcache.jit=tracing
opcache.jit_buffer_size=0	// 無効化の設定

 直感的に分かりにくいということで、opcache.jitをdisableに設定するという分かりやすい方法に変わりました。

opcache.jit=disable
opcache.jit_buffer_size=64m

 なお、これは既定値であるので、特に指定しなければ従来と変わりません。つまり、これまでのアプリには影響を与えません。

問題のある拡張モジュールのアンバンドル化

 PHP 8.4では、拡張モジュールimap(IMAP、POP3、NNTPのサポート)、pspell(スペルチェック)、oci8(Oracle OCI8サポート)、pdo_oci(Oracle関数)をバンドルから除外しました。PECLから必要に応じてインストールすることができます。

DOMの機能強化

 DOMの利用においても機能が強化されました。

HTML5対応のDOM\HTMLDocument

 PHP 8.4では、新しく導入されたクラス\DOM\HTMLDocumentで、HTML5準拠のDOM(Document Object Model)の取り扱いが可能になりました。

 これまでは、DOMの操作にはlibxmlによるパーサを利用するしかありませんでしたが、このライブラリはHTML4準拠であるという問題が長い間続いていました。これが、HTML5対応のパーサLexborの導入で、HTML5でも問題なくパースできる環境が整いました。これに合わせて、HTML Living Standard準拠へのDOM対応の修正が実施されています。

 以下は、HTML4とHTML5のファイルを用意して読み込んでいる例です(ファイルの全容は配布サンプルを参照)。DOMDocumentクラスのloadメソッドによる読み込みで、HTML4ファイルは問題なく読み込めますが、HTML5ファイルは開始タグと終了タグがマッチしないなどのWarningが発生します。DOM\HTMLDocumentクラスのcreateFromFileでは、HTML5ファイルを問題なく読み込めます。

リスト dom_parser.html
$dom = new DOMDocument();
$dom->load('html4.html');	// HTML4準拠のファイルでは問題なし
$dom->load('html5.html');	// HTML5準拠のファイルではWarning

$dom5 = DOM\HTMLDocument::createFromFile('html5.html');		// 問題なし

DOM操作のための関数querySelector/closest/matches

 PHP 8.4では、DOM操作のための関数querySelector、closest、matchesが、新しいDOMクラスに用意されました。いずれもJavaScriptにある同名の関数に相当します。

  • querySelector:セレクタによる検索
  • closest:当該要素から祖先方向に、指定されるセレクタに合致する最初の要素を検索
  • matches:当該要素が指定されるセレクタに一致するかチェック

 以下のリストは、サンプル確認のためのHTML5ファイルのbody要素内を抜粋したものです。

リスト html5.html
<div id="root">
    <p id="child"><span>p span</span></p>
</div>

 DOMは、以下のリストのようにcreateFromFile静的メソッドで上記のHTML5ファイルを直接読み込んで構築できます。

リスト dom_opr.html
$dom5 = DOM\HTMLDocument::createFromFile('html5.html');
var_dump($dom5->querySelector('p span')->textContent);
// string(6) "p span"
var_dump($dom5->getElementById('child')->closest('div')->getAttribute("id"));
// string(8) "root"
var_dump($dom5->getElementById('root')->matches('body > div'));
// bool(true)

次のページ
関数の機能強化

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

  • 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング