【PHP8.x】parentNodeプロパティの使い方

parentNodeプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

parentNodeプロパティは、このノードの親ノードを保持するプロパティです。DOM(Document Object Model)では、HTMLやXMLドキュメントを親子関係を持つ階層的なツリー構造として扱います。このプロパティは、ツリー構造内のあるノードから見て、一つ上の階層に位置するノード、つまり親ノードを取得するために使用されます。DOMDocumentTypeは文書型定義(例: <!DOCTYPE html>)を表すノードであり、その親ノードは常にドキュメント全体を表すDOMDocumentオブジェクトとなります。したがって、DOMDocumentTypeオブジェクトのparentNodeプロパティにアクセスすると、その文書型定義が属しているDOMDocumentオブジェクトが返されます。もし、このノードがまだドキュメントツリーに追加されていない場合、親ノードは存在しないためnullを返します。このプロパティはDOMNodeクラスから継承された読み取り専用のプロパティであり、直接値を代入して親ノードを変更することはできません。

構文(syntax)

1<?php
2
3// DOCTYPE宣言を含むHTML文字列
4$html = '<!DOCTYPE html><html><head><title>Test</title></head><body></body></html>';
5
6// DOMDocumentオブジェクトを作成し、HTMLを読み込む
7$doc = new DOMDocument();
8$doc->loadHTML($html);
9
10// DOCTYPEノード (DOMDocumentTypeオブジェクト) を取得
11$doctype = $doc->doctype;
12
13// parentNodeプロパティを使い、DOCTYPEノードの親ノードを取得する
14// この場合、親ノードはドキュメント全体を表すDOMDocumentオブジェクト自身です
15$parentNode = $doctype->parentNode;
16
17// 親ノードのノード名を出力して確認
18echo $parentNode->nodeName;
19
20?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

?DOMNode

DOMDocumentType オブジェクトの親ノードを表す DOMNode オブジェクト、または親ノードがない場合は null を返します。

サンプルコード

PHP DOM parentNode の親ノードを取得する

1<?php
2
3/**
4 * DOMDocumentType::parentNode プロパティの使用例を示します。
5 * DOMDocumentType の親ノードは常にその DOMDocument オブジェクト自身です。
6 */
7function demonstrateDomDocumentTypeParentNode(): void
8{
9    // <!DOCTYPE html> 宣言を含むHTML文字列を定義します。
10    // このDOCTYPE宣言がDOMDocumentTypeノードとして解析されます。
11    $htmlString = '<!DOCTYPE html>
12<html>
13<head>
14    <title>サンプルドキュメント</title>
15</head>
16<body>
17    <h1>DOMDocumentType の親ノード</h1>
18    <p>このページはDOM操作のデモンストレーション用です。</p>
19</body>
20</html>';
21
22    // 新しい DOMDocument オブジェクトを作成します。
23    $dom = new DOMDocument();
24
25    // HTML文字列を DOMDocument にロードします。
26    // loadHTML はHTMLの構造によって警告を出すことがありますが、
27    // この例ではシンプルにするためエラー抑制演算子 @ を使用しています。
28    @$dom->loadHTML($htmlString);
29
30    // ドキュメントから DOMDocumentType ノードを取得します。
31    // <!DOCTYPE html> がこれに該当します。
32    $doctypeNode = $dom->doctype;
33
34    // ドキュメントタイプノードが存在するか確認します。
35    if ($doctypeNode instanceof DOMDocumentType) {
36        echo "--- 取得した DOMDocumentType ノードの情報 ---\n";
37        echo "ノード名: " . $doctypeNode->nodeName . " (例: 'html' または 'doctype')\n";
38        echo "ノードタイプ: " . $doctypeNode->nodeType . " (DOM_DOCUMENT_TYPE_NODE = " . DOM_DOCUMENT_TYPE_NODE . ")\n\n";
39
40        // DOMDocumentType の parentNode プロパティにアクセスして、親ノードを取得します。
41        // このプロパティは、DOMDocumentType が属する DOMDocument オブジェクトを返します。
42        $parentNode = $doctypeNode->parentNode;
43
44        // 親ノードが存在するか確認します。
45        if ($parentNode instanceof DOMNode) {
46            echo "--- parentNode (親ノード) の情報 ---\n";
47            echo "ノード名: " . $parentNode->nodeName . " (常に '#document')\n";
48            echo "ノードタイプ: " . $parentNode->nodeType . " (DOM_DOCUMENT_NODE = " . DOM_DOCUMENT_NODE . ")\n\n";
49
50            // 取得した親ノードが、元の DOMDocument オブジェクトと同一であるか確認します。
51            if ($parentNode === $dom) {
52                echo "結果: DOMDocumentType の親ノードは、元の DOMDocument オブジェクトと同一です。\n";
53                echo "これは、DOMDocumentType が DOMDocument の直接の子ノードであることを示します。\n";
54            } else {
55                echo "結果: DOMDocumentType の親ノードが、元の DOMDocument オブジェクトと一致しませんでした (予期せぬ状態)。\n";
56            }
57        } else {
58            echo "エラー: DOMDocumentType の親ノードが見つかりませんでした (予期せぬ状態)。\n";
59        }
60    } else {
61        echo "エラー: ドキュメントタイプノードが見つかりませんでした。HTMLに <!DOCTYPE> 宣言が含まれているか確認してください。\n";
62    }
63}
64
65// 上記の関数を実行して、DOMDocumentType::parentNode の動作をデモンストレーションします。
66demonstrateDomDocumentTypeParentNode();
67

PHPのDOMDocumentType::parentNodeプロパティは、DOM (Document Object Model) において、特定のDOMDocumentTypeノードの親ノードを取得するために使用されます。DOMDocumentTypeは、HTMLやXML文書の冒頭にある<!DOCTYPE ...>宣言を表すオブジェクトです。このプロパティは引数を持ちません。

戻り値は?DOMNode型で、親ノードが存在する場合はDOMNodeオブジェクトを返し、親ノードが存在しない場合はnullを返します。しかし、DOMDocumentTypeノードの場合、親ノードは常にそのドキュメント全体を管理するDOMDocumentオブジェクト自身となるため、通常はDOMNodeオブジェクトが返されます。

サンプルコードでは、<!DOCTYPE html>宣言を含むHTML文字列をDOMDocumentにロードし、そこからDOMDocumentTypeノードを取得しています。そして、このDOMDocumentTypeノードのparentNodeプロパティにアクセスし、返された親ノードが元のDOMDocumentオブジェクトと同一であることを確認しています。これにより、<!DOCTYPE>宣言がドキュメントの最上位要素であるDOMDocumentオブジェクトの直接の子ノードとして位置づけられていることが示されます。このプロパティは、DOMツリー構造におけるノード間の親子関係をプログラムで確認する際に役立ちます。

DOMDocumentType::parentNode は、ドキュメントタイプノードの親であり、常にその DOMDocument オブジェクト自身を返します。これは、DOMツリー内でドキュメントタイプが DOMDocument の直接の子として配置されるためです。戻り値の型 ?DOMNodenull の可能性を示唆しますが、DOMDocumentType が正常に取得できていれば通常は null になりません。

DOMDocument::loadHTML メソッドで @ 演算子を使って警告を抑制していますが、実運用ではエラーハンドリングを適切に行い、予期せぬ問題を把握することが重要です。また、サンプルコードのように instanceof=== 演算子で型やオブジェクトの同一性を確認する手法は、安全で堅牢なDOM操作を行う上で非常に有効です。

関連コンテンツ

関連プログラミング言語