ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

PHP8, DOM生成クラスに新しいインタフェース追加。ノードクラスの再構成。

php
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

あまり使う機会はないですが、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操作

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を扱う既存クラスにすでに実装されてます。

PHP公式ドキュメント

Interface - DOMParentNode

Class - DOMDocument

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公式ドキュメント

Interface - DOMChildNode

新インタフェースを実装したクラス

今回追加されたインタフェースを実装したクラスです。ノードに関するインタフェースなのでノードクラスだけに実装されてる。

DOMDocumentDOMNode
└ DOMDocument implements DOMParentNode
DOMDocumentFragmentDOMNode
└ DOMDocumentFragment implements DOMParentNode
DOMElementDOMNode
└ DOMElement implements DOMParentNode, DOMChildNode
DOMCharacterDataDOMNode
└ DOMCharacterData implements DOMChildNode
DOMCommentDOMNode
└ DOMCharacterData implements DOMChildNode
└ DOMComment
DOMTextDOMNode
└ DOMCharacterData implements DOMChildNode
└ DOMText
DOMCdataSectionDOMNode
└ DOMCharacterData implements DOMChildNode
└ DOMText
└ DOMCdataSection
新インタフェースを実装したクラス

新インタフェースをimplementsしたクラスには、追加したノードを保存するプロパティも追加されました。リンク先を確認してください。

また、ノードクラスでも新インタフェースを実装してないのもあります。

DOMNodeノードクラスの一番の親クラス
DOMEntityDOMNode
└ DOMEntity
DOMEntityReferenceDOMNode
└ DOMEntityReference
DOMAttrDOMNode
└ DOMAttr
DOMDocumentTypeDOMNode
└ DOMDocumentType
DOMNotationDOMNode
└ DOMNotation
DOMProcessingInstructionDOMNode
└ 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(ダブリュー・サン・シー)

World Wide Web Consortium

HTML, CSSの標準化団体。仕様の策定から勧告まで行う。HTML5からは策定は行わず勧告だけを行うようになった。

策定どのような機能を追加・変更・削除するのか決めること。
勧告決まった仕様の対応を開発元に促すこと。

2019年にHTMLの仕様策定から撤退し、長年対立してきたWHATWGへ移管。

じつはHTML5の仕様策定はWHATWGが行っており、それをW3Cが追認して勧告した。

この時点でHTML5は終わっている。

後継のHTML標準仕様のことを HTML Living Standard という。

前の投稿
PHP8, get_resource_id, リソースIDを取得する関数。これ作った意味ある?
PHP8.1, $GLOBALSの丸ごと書き換えはエラーになる
次の投稿
コメントを残す

*