あまり使う機会はないですが、PHPにはHTMLのDOM(HTMLをメモリ上に展開したもの)を扱うクラスがたくさん用意されています。
PHP8ではそれに、新しいインタフェースが追加されました。
これらのクラスはXMLを扱うものにも使われ、どちらかといえばこっちのほうが慣れ親しい。
XML操作でも使われるDOMクラス群
ど頭でPHPのDOMクラスはあまり使わないと言っちゃいましたが、たとえばxmlファイルを読み込んでデータを操作するときはDOMクラス群を使います。
DOM(Document Object Model)
htmlのタグや属性の情報をメモリ上に展開したもの。オブジェクト(変数)でhtmlタグの内容が参照できる。
htmlに限らず、xmlなどのマークアップ言語全般に関する規定。W3Cから勧告されている。
ツリーの構成をしているので、DOMツリーとも呼ばれる。
JavaScriptでhtmlの情報をあつかうときは、DOMにアクセスしている。
じっさい、PHPの公式ドキュメントでもXML操作のところでこのクラス群は登場する。
PHP公式ドキュメント
XMLを操作するクラスではノード単位で管理されていて、それがこのDOMクラス群と思っていいです。
XMLもDOMも同じマークアップ言語だからできること。
ちなみに、xmlやDOM(HTML)などのマークアップ言語のタグ(<>)で囲ったグループやタグ内の要素のことをメモリ上ではノードと言います。
タグ内のタグや要素は親ノードと子ノードと呼ばれ、タグの階層を親子関係にたとえます。
このへんはJavaScriptを使ってれば分かりますよね?
DOMParentNode インターフェイス
PHP8で追加されたインタフェースは2つです。まずはその1個目から。
interface DOMParentNode {
/**
* 最後の子ノードの後ろにノードを追加する
*/
public append(DOMNode|string ...$nodes): void
/**
* 最初の子ノードの前にノードを追加する
*/
public prepend(DOMNode|string ...$nodes): void
}
このインタフェースは、親ノードになるクラスにimplementsされてます。たとえば、DOMの一番最上位クラスのDOMDocumentクラスとか。
親ノードになるクラスは必ず、子ノードの前後に新しい子ノードを追加するメソッド(append(), prepend())がないといけません。
このメソッドを自作する必要はありません。DOMを扱う既存クラスにすでに実装されてます。
DOMChildNode インターフェイス
もう1つ追加されたインタフェースは子ノードに実装されるものです。
今回追加されたインタフェースはノードに関するものだけ。親ノードと子ノードで性格がちがうところをインタフェースで整理したんですね?
interface DOMChildNode {
/**
* ノードの後ろにノードを追加する
*/
public after(DOMNode|string ...$nodes): void
/**
* ノードの前にノードを追加する
*/
public before(DOMNode|string ...$nodes): void
/**
* ノードを削除する
*/
public remove(): void
/**
* ノードを新しいノードで置き換える
*/
public replaceWith(DOMNode|string ...$nodes): void
}
このメソッドも自作する必要はありません。子ノードになるクラスにすでに実装されてます。
PHP公式ドキュメント
新インタフェースを実装したクラス
今回追加されたインタフェースを実装したクラスです。ノードに関するインタフェースなのでノードクラスだけに実装されてる。
DOMDocument | DOMNode └ DOMDocument implements DOMParentNode |
DOMDocumentFragment | DOMNode └ DOMDocumentFragment implements DOMParentNode |
DOMElement | DOMNode └ DOMElement implements DOMParentNode, DOMChildNode |
DOMCharacterData | DOMNode └ DOMCharacterData implements DOMChildNode |
DOMComment | DOMNode └ DOMCharacterData implements DOMChildNode └ DOMComment |
DOMText | DOMNode └ DOMCharacterData implements DOMChildNode └ DOMText |
DOMCdataSection | DOMNode └ DOMCharacterData implements DOMChildNode └ DOMText └ DOMCdataSection |
新インタフェースをimplementsしたクラスには、追加したノードを保存するプロパティも追加されました。リンク先を確認してください。
また、ノードクラスでも新インタフェースを実装してないのもあります。
DOMNode | ノードクラスの一番の親クラス |
DOMEntity | DOMNode └ DOMEntity |
DOMEntityReference | DOMNode └ DOMEntityReference |
DOMAttr | DOMNode └ DOMAttr |
DOMDocumentType | DOMNode └ DOMDocumentType |
DOMNotation | DOMNode └ DOMNotation |
DOMProcessingInstruction | DOMNode └ DOMProcessingInstruction |
実装していないクラスの特長は、そのノードが親子関係にならないもの。
DOMまわりの内部をオブジェクト指向にしたがってシンプルにしたので、すでに使ってる側からするとあまりちがいはありません。
これから先も、新しいメソッド・プロパティが追加されるでしょう。追加がかんたんにできるように整理されたので。
RFCでは、DOM Living Standard APIという名称を使ってる。
Living Standardは、HTMLの新しい標準仕様の名称で、それ以前はW3Cという標準化団体が行っていた。
2019年に、W3CはHTMLの標準化をWHATWGに完全移管。
W3Cは以前から新しいものへの対応に消極的で、逆に積極的なWHATWGと対立していた。
現在、WHATWGが策定する唯一のHTML標準仕様のことを HTML Living Standardといい、HTML5の後継に位置づけられている。
じつはHTML5は、W3Cの撤退により終わっている。
RFCでは、日々進化していくHTMLへ対応するための変更と言いたいらしい。
W3C(ダブリュー・サン・シー)
HTML, CSSの標準化団体。仕様の策定から勧告まで行う。HTML5からは策定は行わず勧告だけを行うようになった。
策定 | どのような機能を追加・変更・削除するのか決めること。 |
勧告 | 決まった仕様の対応を開発元に促すこと。 |
2019年にHTMLの仕様策定から撤退し、長年対立してきたWHATWGへ移管。
じつはHTML5の仕様策定はWHATWGが行っており、それをW3Cが追認して勧告した。
この時点でHTML5は終わっている。
後継のHTML標準仕様のことを HTML Living Standard という。
PHP公式ドキュメント