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

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

作成日: 更新日:

基本的な使い方

parentNodeプロパティは、所属するDom\CharacterDataオブジェクトの親ノードを保持するプロパティです。

Dom\CharacterDataクラスは、PHPのDOM拡張機能において、XMLやHTMLなどの文書構造を表現するDOM(Document Object Model)ツリー内の文字データを含むノードの共通の基盤を提供する抽象クラスです。具体的には、文書内のテキスト、コメント、CDATAセクションといった種類のノードがこのクラスを継承しています。

このparentNodeプロパティを利用することで、現在操作している文字データノードが、DOMツリーのどの要素ノードや他のノードの子であるかを簡単に取得できます。DOMツリーは親子関係で構成される階層構造を持っており、parentNodeプロパティはその階層を上方向、つまり親ノードの方向へ遡るために非常に重要な役割を果たします。

例えば、あるテキストノードの内容を処理した後、そのテキストノードが属する親要素ノードを取得し、さらに親要素ノードに対して別の操作を行いたい場合に、このプロパティが役立ちます。もし、現在のノードがツリーの最上位に位置しており、親ノードが存在しない場合(例えば、Documentノードなど)、parentNodeプロパティはnullを返します。この挙動により、プログラムで親の存在を確認しながら、安全かつ確実にDOMツリーを探索し、操作することが可能になります。

このように、parentNodeプロパティは、DOMツリー内のノード間の関係性を理解し、PHPを用いて文書構造を効率的に操作するための、基本的でありながら不可欠な機能を提供します。

構文(syntax)

1<?php
2// DOMDocumentのインスタンスを作成
3$dom = new DOMDocument();
4
5// 親要素として <p> 要素を作成し、ドキュメントに追加
6$parentElement = $dom->createElement('p');
7$dom->appendChild($parentElement);
8
9// テキストノード(Dom\Textクラス、これはDom\CharacterDataを継承しています)を作成
10$characterDataInstance = $dom->createTextNode('これはサンプルテキストです。');
11
12// テキストノードを親要素に追加
13$parentElement->appendChild($characterDataInstance);
14
15// Dom\CharacterDataオブジェクトのparentNodeプロパティにアクセスし、親ノードを取得する構文
16$parent = $characterDataInstance->parentNode;
17
18// $parent は $parentElement と同じ Dom\Element オブジェクト(ここでは <p> 要素)を参照します。
19// 例えば、echo $parent->nodeName; とすると "p" と出力されます。
20?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

?Dom\Node

このプロパティは、現在の文字データノードの親ノードを返します。親ノードが存在しない場合は null を返します。

サンプルコード

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

1<?php
2
3/**
4 * Dom\CharacterData::parentNode プロパティの使用例を示します。
5 * Dom\CharacterData は Dom\Text や Dom\Comment などの基底クラスです。
6 * parentNode プロパティは、そのノードの親ノード (Dom\Node) を返します。
7 * 親ノードが存在しない場合は null を返します。
8 */
9function demonstrateDomCharacterDataParentNode(): void
10{
11    // 1. 新しい DOM ドキュメントを作成
12    $dom = new Dom\Document();
13
14    // 2. ルート要素 (例: <body>) を作成し、ドキュメントに追加
15    $bodyElement = $dom->createElement('body');
16    $dom->appendChild($bodyElement);
17
18    // 3. テキストノードを作成し、<body> 要素の子として追加
19    // Dom\Text は Dom\CharacterData を継承しています。
20    $textNode = $dom->createTextNode('これはサンプルテキストです。');
21    $bodyElement->appendChild($textNode);
22
23    echo "--- Dom\\CharacterData::parentNode のデモンストレーション ---" . PHP_EOL;
24
25    // 4. textNode の parentNode プロパティにアクセスして親ノードを取得
26    // parentNode は ?Dom\Node を返します。
27    $parentNode = $textNode->parentNode;
28
29    if ($parentNode instanceof Dom\Node) {
30        // 親ノードが存在する場合、そのノード名とタイプを表示
31        echo "テキストノードの親ノード名: " . $parentNode->nodeName . PHP_EOL;
32        echo "親ノードのタイプ (定数): " . $parentNode->nodeType . " (XML_ELEMENT_NODE: " . XML_ELEMENT_NODE . ")" . PHP_EOL;
33        echo "期待される親ノード名: body" . PHP_EOL;
34    } else {
35        echo "テキストノードには親ノードがありません (null)。" . PHP_EOL;
36    }
37
38    echo PHP_EOL;
39
40    // 5. コメントノードでの例 (Dom\Comment も Dom\CharacterData を継承)
41    $commentNode = $dom->createComment('これはコメントです');
42    $bodyElement->appendChild($commentNode); // コメントノードを bodyElement の子として追加
43
44    $parentNodeOfComment = $commentNode->parentNode;
45
46    if ($parentNodeOfComment instanceof Dom\Node) {
47        echo "コメントノードの親ノード名: " . $parentNodeOfComment->nodeName . PHP_EOL;
48        echo "コメントノードのタイプ (定数): " . $parentNodeOfComment->nodeType . " (XML_ELEMENT_NODE: " . XML_ELEMENT_NODE . ")" . PHP_EOL;
49        echo "期待される親ノード名: body" . PHP_EOL;
50    } else {
51        echo "コメントノードには親ノードがありません (null)。" . PHP_EOL;
52    }
53
54    echo PHP_EOL;
55
56    // 6. 親ノードを持たない Dom\Text ノードの例
57    $detachedTextNode = new Dom\Text('親のないテキスト');
58    $detachedParentNode = $detachedTextNode->parentNode;
59
60    echo "--- 親ノードを持たない Dom\\CharacterData の例 ---" . PHP_EOL;
61    if ($detachedParentNode === null) {
62        echo "切り離されたテキストノードは親ノードを持ちません (null を返します)。" . PHP_EOL;
63    } else {
64        // この分岐は実行されません
65        echo "切り離されたテキストノードの親ノード名: " . $detachedParentNode->nodeName . PHP_EOL;
66    }
67}
68
69// 関数を実行してデモンストレーションを開始
70demonstrateDomCharacterDataParentNode();

PHPのDom\CharacterData::parentNodeプロパティは、HTMLやXMLドキュメントの構造を表すDOM(Document Object Model)において、特定のノードの親ノードを取得するために使用されます。Dom\CharacterDataは、テキストノード(Dom\Text)やコメントノード(Dom\Comment)といった文字データを持つノードの基底クラスです。

このparentNodeプロパティにアクセスすると、現在操作しているDom\CharacterDataオブジェクトがDOMツリー内でどのノードの子であるか、その親ノードをDom\Nodeオブジェクトとして取得できます。例えば、<body>要素に追加されたテキストノードに対してparentNodeを使用すると、<body>要素を表すDom\Nodeオブジェクトが返されます。引数は必要ありません。

親ノードが存在しない場合、つまりそのノードがまだDOMツリーに追加されていない状態や、ドキュメントのルートノードである場合は、nullが返されます。戻り値の型が?Dom\Nodeと表記されるのは、Dom\Nodeオブジェクトかnullのどちらかが返されることを意味します。サンプルコードでは、テキストノードやコメントノードが親要素に追加されている場合はその親要素の情報を表示し、どの親要素にも追加されていないノードの場合にはnullが返されることを具体的に示しています。これにより、ノード間の階層関係をプログラムで簡単に辿ることができます。

Dom\CharacterData::parentNodeプロパティを利用する際は、ノードに親が存在しない場合(例えば、まだDOMツリーに追加されていないノードや、ツリーから切り離されたノード)には、戻り値がnullとなることに注意が必要です。そのため、取得した値を利用する前には、必ずnullチェックを行うようにしてください。例えば、if ($parentNode instanceof Dom\Node)のように確認することで、安全に親ノードのプロパティやメソッドにアクセスできます。このプロパティはDom\TextDom\CommentなどのDom\CharacterDataを継承するノードに適用され、親ノードが返される場合はDom\Node型のインスタンスとなります。