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

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

作成日: 更新日:

基本的な使い方

parentNodeプロパティは、PHPのDOM拡張機能において、DOMNodeクラスのインスタンスが所属するDOMツリーにおける親ノードを保持するプロパティです。このプロパティを使用することで、現在のノードからその直上の親ノードにアクセスできます。

具体的には、DOMNodeオブジェクトが表す要素やテキストなどのノードが、どの要素やドキュメントの子ノードであるかを特定する際に利用されます。例えば、特定のHTML要素の子ノードから、その親要素に移動してさらに操作を行いたい場合に、このparentNodeプロパティを参照します。

parentNodeプロパティが保持する値は、親ノードを表すDOMNode型のオブジェクト、または親ノードが存在しない場合はnullになります。親ノードが存在しないケースとしては、DOMDocumentオブジェクト(ドキュメントツリーのルートノード)自体や、DOMDocumentFragmentのようにまだ実際のドキュメントツリーに挿入されていないノードなどが挙げられます。

このプロパティは読み取り専用であり、その値を直接変更することはできません。これは、DOMツリーの構造的な整合性を保つための設計です。parentNodeプロパティは、DOMツリーの階層構造を上方向にたどるナビゲーションにおいて不可欠であり、複雑なDOM構造を解析したり操作したりする際に非常に役立ちます。

構文(syntax)

1<?php
2$html = '<html><body><div id="container"><p>Hello, World!</p></div></body></html>';
3
4$dom = new DOMDocument();
5$dom->loadHTML($html);
6
7// <p>ノードを取得します
8$paragraphNode = $dom->getElementsByTagName('p')->item(0);
9
10if ($paragraphNode) {
11    // parentNode プロパティを使用して、現在のノードの親ノードを取得します
12    $parentNode = $paragraphNode->parentNode;
13
14    // 取得した親ノードの名前を表示します(この場合 'div' が表示されます)
15    echo $parentNode->nodeName;
16}
17?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

?DOMNode

このプロパティは、現在のDOMNodeオブジェクトの親ノードを表すDOMNodeオブジェクトを返します。親ノードが存在しない場合は null を返します。

サンプルコード

PHP DOM parentNodeで親要素を取得する

1<?php
2
3/**
4 * DOMNode::parentNode プロパティの使用例を示す関数
5 *
6 * 指定されたIDを持つHTML要素を取得し、その親要素の情報を表示します。
7 */
8function demonstrateParentNode(): void
9{
10    // 操作対象となるHTMLコンテンツを文字列として定義します。
11    $html = <<<HTML
12<!DOCTYPE html>
13<html lang="ja">
14<head>
15    <title>DOMNode::parentNode サンプル</title>
16</head>
17<body>
18    <div id="container">
19        <p id="target">この段落要素の親ノードを取得します。</p>
20    </div>
21</body>
22</html>
23HTML;
24
25    // DOMDocumentオブジェクトをインスタンス化します。
26    $dom = new DOMDocument();
27
28    // HTML文字列を読み込み、DOMツリーを構築します。
29    // エラーを抑制するためのおまじないです。
30    libxml_use_internal_errors(true);
31    $dom->loadHTML($html);
32    libxml_clear_errors();
33
34    // ID 'target' を持つp要素 (DOMNode) を取得します。
35    $childNode = $dom->getElementById('target');
36
37    if ($childNode) {
38        // parentNode プロパティを使って、子ノードの親ノードを取得します。
39        // この場合、<div id="container"> 要素のオブジェクトが返されます。
40        $parentNode = $childNode->parentNode;
41
42        // 親ノードが取得できたか確認します (ルート要素でなければ通常は存在します)。
43        // DOMElementはDOMNodeを継承したクラスで、タグ名などの情報を持っています。
44        if ($parentNode instanceof DOMElement) {
45            echo "ID 'target' を持つ要素の親ノードは、<{$parentNode->tagName}> タグです。" . PHP_EOL;
46            echo "その親ノードのID属性は '{$parentNode->getAttribute('id')}' です。" . PHP_EOL;
47        }
48    } else {
49        echo "ID 'target' を持つ要素が見つかりませんでした。" . PHP_EOL;
50    }
51}
52
53// 関数を実行して結果を表示します。
54demonstrateParentNode();
55
56?>

PHP 8におけるDOMNode::parentNodeプロパティは、HTMLやXML文書の構造を扱う際に非常に重要な役割を果たします。このプロパティを使用すると、現在注目しているDOMノードの直上の親ノードを簡単に取得することができます。

DOM文書は階層構造、つまりツリー状になっており、各要素は親子関係を持っています。例えば、<p>タグが<div>タグの中に含まれている場合、<p>は子ノード、<div>は親ノードとなります。parentNodeプロパティは引数を取らず、この親ノードを表すDOMNodeオブジェクトを返します。もし親ノードが存在しない場合(例えば、文書のルートノードである<html>要素の親は存在しません)、戻り値はnullとなります。この戻り値の型は?DOMNodeと表記され、DOMNodeオブジェクトかnullのどちらかであることを示しています。

提供されたサンプルコードでは、まずHTML文字列からDOMツリーを構築し、特定のIDを持つ<p>要素(#target)を取得しています。次に、この<p>要素のparentNodeプロパティにアクセスすることで、その親要素である<div id="container">DOMElementオブジェクトを取得しています。これにより、取得した親ノードのタグ名やID属性といった情報を簡単に取り出すことが可能となり、結果として「ID 'target' を持つ要素の親ノードは、<div> タグです。その親ノードのID属性は 'container' です。」といった情報が出力されます。このようにparentNodeは、要素の親子関係をたどる際に非常に便利な機能です。

parentNodeプロパティは、親ノードが存在しない場合にnullを返します。例えば、HTMLのルート要素では親ノードがないため、必ず戻り値がnullでないか確認してください。戻り値の型はDOMNodeですが、tagNamegetAttributeといった要素特有の情報を扱う際は、instanceof DOMElementで具体的な型をチェックしてからアクセスすると安全です。また、要素の取得(getElementByIdなど)も対象が見つからない場合にnullを返すことがあるため、その後の処理に進む前に取得の成否を確認することが重要です。HTMLの解析時にはエラーが発生しうるため、libxml関連の関数で適切にエラーを処理する点も理解しておくと、より堅牢なコードになります。

関連コンテンツ

関連プログラミング言語