PHP ネイティブの DOMDocument を基盤として、このプロジェクトはブラウザでのクライアントサイドコードを扱う際に期待されるような、モダンな DOM API へのアクセスを提供します。
サーバーサイドコードで DOM 操作を行うことで、動的ページの構築方法が向上します。標準化されたオブジェクト指向インターフェースを利用することで、ページを事前処理することができ、ブラウザ、ウェブサーバー、コンテンツ配信ネットワークにメリットをもたらします。
重要な注意: ここで示す例は説明目的のものであり、DOM を使用して要素の値に直接データを設定することは、ロジックとビューを密結合させてしまうため、悪い習慣と見なされます。データを DOM にバインドするためのより堅牢なソリューションについては、 ライブラリを参照してください。
名前を入力する input 要素を持つフォームを含むページを考えてみましょう。フォームが送信されると、ページはあなたの名前で挨拶するはずです。
これは、ソース HTML ファイルをテンプレートとして扱う方法の簡単な例です。これは、{{curly braces}} のようなプレースホルダーや、PHP 内からの echo '<div class='easy-mistake'>' . $content['opa'] . '</div>' のようなエラーが発生しやすい HTML 構築といった非標準的な手法を必要とせずに、より高度なテンプレートページに簡単に適用して動的コンテンツを提供できます。
name.html)<!doctype html>
<h1>
Hello, <span class="name-output">you</span> !
</h1>
<form>
<input name="name" placeholder="Your name, please" required />
<button>Submit</button>
</form>
index.php)<?php
use Gt\Dom\HTMLDocument;
use Gt\Dom\HTMLElement\HTMLSpanElement;
require "vendor/autoload.php";
$html = file_get_contents("name.html");
$document = new HTMLDocument($html);
if(isset($_GET["name"])) {
$span = $document->querySelector(".name-output");
$span->innerText = $_GET["name"];
}
echo $document;
Element 型は、HTMLAnchorElement (<a>)、HTMLButtonElement (<button>)、HTMLInputElement (<input>)、HTMLTableSectionElement (<thead>、<tbody>、<tfoot>) など、すべての HTMLElement 仕様を表します。特定の型は Element::getElementType() で検出でき、ElementType 列挙値のいずれかを返します。EnumeratedValueException、HierarchyRequestError、IndexSizeException など、さまざまな種類の例外をキャッチするための DOMException 拡張。FileList、StyleSheet、VideoTrackList、WindowProxy などのクラスを含む、クライアントサイド機能のスタブ。Element::querySelector() および (Element::querySelectorAll()) を使用して CSS セレクターで要素を参照ClassList を使用して要素のクラスを追加/削除/切り替えElement::previousElementSibling、Element::nextElementSibling、Element::children、Element::lastElementChild、firstElementChild などで Element のみのノードを走査ChildNode::remove()、、、 で子ノードを挿入および削除HTMLDocument の標準プロパティ:
このリポジトリは、https://dom.spec.whatwg.org/ の DOM 仕様に可能な限り正確に準拠することを目指しています。v4.0.0 時点では、すべての機能が実装されており、標準からの以下の軽微ですが避けられない逸脱があります:
tagName プロパティは大文字です。HTMLElement 型を確認するには、Element::getElementType() を呼び出す必要があります。たとえば、instanceof で使用できる Element のサブクラスはありません。HTMLInputElement::files は、ブラウザのインターフェースを通じてユーザーが選択したすべてのファイルを列挙する FileList を返します。この種の機能はサーバーサイドで実装することは不可能ですが、仕様との整合性のためにスタブ化されています。このライブラリ内でクライアントサイド機能を使用しようとすると、ClientSideOnlyFunctionalityException がスローされます。このリポジトリは、DOM 仕様に可能な限り正確であることを意図しています。リポジトリの拡張機能は https://php.gt/domtemplate で利用でき、カスタム要素とテンプレート属性を通じてページテンプレートとデータバインディングを追加し、WebComponents のようなサーバーサイド機能を導入します。
PHP 8.4 のリリース以降、PHP にネイティブな新しい HTMLDocument クラスが同梱されています。これにはネイティブバインディングがあるため、すべての操作がはるかに高速です。PHPGT の Dom 実装が新しいネイティブコードを利用できるようにする作業が開始されています。幸いなことに、DOM は非常によく定義された標準であるため、何が起こっても、コードへの変更は最小限または不要です。
php84-benchmark ブランチのベンチマークを自分で確認してください: ほとんどの操作で、ネイティブ実装に切り替えることで 90% 以上の速度向上が記録されています!
ネイティブクラスの実装に向けてさらに作業が進められたら、詳細は readme に記載されます。