Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】Dom\HTMLDocument::isSameNode()メソッドの使い方

isSameNodeメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

isSameNodeメソッドは、指定された2つのDOMノードが同じノードであるかを判定するメソッドです。PHP 8のDOM拡張機能の一部であり、Dom\HTMLDocumentクラスのインスタンスを通じて利用できます。このメソッドは、HTMLやXML文書の構造をプログラムで操作する際に非常に重要です。

DOMノードとは、WebページのHTML要素(例えば<div>タグや<p>タグ)、その要素の属性、テキストコンテンツなど、文書を構成する個々の部品を指します。

isSameNodeメソッドは、2つのDOMNodeオブジェクトがメモリ上で物理的に同一のオブジェクトインスタンスであるかを確認します。これは、ノードが持つ「内容」や「構造」が同じであるかどうかを比較するものではありません。例えば、二つの<div>要素が全く同じテキスト内容を持っていても、それらが文書内の異なる位置に存在する場合(つまり異なるオブジェクトインスタンスである場合)、このメソッドはfalseを返します。しかし、あるノードを変数に代入し、その同じノードの参照を別の変数にも代入した場合、それらの変数が指すノードは物理的に同一であるため、trueを返します。

このメソッドは、特定のノードがすでに処理済みであるか、あるいは特定の操作の対象となるノードが意図したものであるかを確認する際に役立ちます。異なるDOMDocumentインスタンスに属するノード同士は、通常、同一とは見なされません。メソッドの戻り値は真偽値(trueまたはfalse)です。

構文(syntax)

1<?php
2
3$htmlDocumentInstance = new DOM\HTMLDocument();
4$anotherNodeInstance = $htmlDocumentInstance->createElement('p');
5
6$isTheSameNode = $htmlDocumentInstance->isSameNode($anotherNodeInstance);
7
8?>

引数(parameters)

?DOM\Node $other_node

  • ?DOM\Node $other_node: 比較対象のDOMノード。nullを指定することも可能です。

戻り値(return)

bool

このメソッドは、呼び出し元のノードと引数で渡されたノードが同じノードである場合に true を返し、そうでない場合に false を返します。

サンプルコード

PHP DomDocument isSameNodeでノード比較する

1<?php
2
3/**
4 * Dom\HTMLDocument::isSameNode メソッドのサンプルコード
5 *
6 * この関数は、Dom\HTMLDocument クラスを使用してHTMLドキュメントを操作し、
7 * 2つのノードが全く同じオブジェクトであるかを判断する isSameNode メソッドの利用方法を示します。
8 * キーワード "php isnotempty" に関連して、ノードが null でないことの確認も含まれています。
9 *
10 * @return void
11 */
12function demonstrateIsSameNode(): void
13{
14    // Dom\HTMLDocument のインスタンスを作成
15    $document = new Dom\HTMLDocument();
16
17    // サンプルHTMLコンテンツをロード
18    // Dom\HTMLDocument は、HTML文字列からDOMツリーを構築するのに使用されます。
19    $document->loadHTML('<div id="item1">Hello</div><p id="item2">World</p>');
20
21    // ID 'item1' の要素を取得
22    $node1 = $document->getElementById('item1');
23
24    // ID 'item1' の要素を再度取得
25    // これは $node1 と全く同じオブジェクト参照になります。
26    $sameNode1Ref = $document->getElementById('item1');
27
28    // ID 'item2' の要素を取得
29    // これは $node1 とは異なるオブジェクト参照になります。
30    $node2 = $document->getElementById('item2');
31
32    // 存在しないIDの要素を取得
33    // getElementById が見つからない場合、null を返します。
34    $nonExistentNode = $document->getElementById('nonexistent');
35
36    echo "--- Dom\\HTMLDocument::isSameNode の使用例 ---\n";
37
38    // 1. 同じノードオブジェクトを参照しているかを確認
39    // isSameNode を呼び出す前に、$node1 と $sameNode1Ref が null でないことを確認します。
40    // これは "php isnotempty" の概念に沿った安全なコーディングプラクティスです。
41    if ($node1 !== null && $sameNode1Ref !== null) {
42        $isSame = $node1->isSameNode($sameNode1Ref);
43        echo "Does \$node1 and \$sameNode1Ref refer to the same node? "
44             . ($isSame ? 'Yes' : 'No') . " (Expected: Yes)\n";
45    }
46
47    // 2. 異なるノードオブジェクトを参照しているかを確認
48    // isSameNode を呼び出す前に、$node1 と $node2 が null でないことを確認します。
49    if ($node1 !== null && $node2 !== null) {
50        $isSame = $node1->isSameNode($node2);
51        echo "Does \$node1 and \$node2 refer to the same node? "
52             . ($isSame ? 'Yes' : 'No') . " (Expected: No)\n";
53    }
54
55    // 3. 存在するノードと null を比較
56    // Dom\HTMLDocument::isSameNode (DOM\Node::isSameNode) は ?DOM\Node を引数に取るため、
57    // null を渡すことが可能です。この場合、常に false を返します。
58    if ($node1 !== null) { // $node1 が null でないことを確認
59        $isSameWithNull = $node1->isSameNode($nonExistentNode); // $nonExistentNode は null
60        echo "Does \$node1 and a null node refer to the same node? "
61             . ($isSameWithNull ? 'Yes' : 'No') . " (Expected: No)\n";
62    }
63
64    echo "\n--- 「isnotempty」の重要性 ---\n";
65    // $nonExistentNode は null です。null オブジェクトに対してメソッドを呼び出すと TypeError が発生します。
66    // PHP 8 では、オブジェクトが null でないこと("isnotempty")を事前に確認することが非常に重要です。
67    if ($nonExistentNode === null) {
68        echo "Note: \$nonExistentNode is null. Attempting to call a method on it (e.g., \$nonExistentNode->isSameNode(...)) "
69             . "would result in a TypeError.\n";
70        echo "Therefore, checks like `\$node !== null` are crucial before using node objects.\n";
71    }
72}
73
74// 上記のデモンストレーション関数を実行
75demonstrateIsSameNode();

PHP 8のDom\HTMLDocument::isSameNodeメソッドは、HTMLドキュメント内で操作している2つのノードが、メモリ上で「全く同じオブジェクト」であるかを判断する際に使用します。このメソッドは、Dom\HTMLDocumentインスタンスから取得した特定のHTML要素(ノード)を、別のノードと比較するために利用されます。

引数には比較したいDOM\Nodeオブジェクトを渡しますが、?が付いているためnullも渡すことが可能です。戻り値はブール値(trueまたはfalse)で、両方のノードがメモリ上で全く同じオブジェクトを指している場合にtrueを、そうでなければfalseを返します。引数にnullが渡された場合、結果は常にfalseとなります。

たとえば、getElementByIdメソッドを使って同じHTML要素を複数回取得した場合、それらのノードはメモリ上の同じオブジェクトを参照しているため、isSameNodetrueを返します。しかし、異なるHTML要素を取得した場合はfalseとなります。

システムエンジニアを目指す方にとって特に重要なのは、「php isnotempty」という考え方です。Dom\HTMLDocumentのメソッド(例: getElementById)は、対象の要素が見つからない場合にnullを返します。PHP 8では、nullに対してメソッドを呼び出すとTypeErrorという実行時エラーが発生するため、isSameNodeを呼び出す前に、比較対象のノードがnullでないことを$node !== nullのように事前に確認することが非常に重要です。この確認を行うことで、安全で堅牢なコードを記述し、予期せぬエラーでシステムが停止する事態を防ぐことができます。

Dom\HTMLDocument::isSameNodeメソッドは、二つのノードが「全く同じオブジェクト」であるか(参照が同じか)を判別します。ノードの内容が同じかどうかを比較するものではない点にご注意ください。

このメソッドを使用する際は、呼び出し元のノードや引数に渡すノードがnullでないかを確認することが非常に重要です。PHP 8では、nullのオブジェクトに対してメソッドを呼び出すとTypeErrorが発生するため、$node !== nullといった事前チェックが必須です。引数にnullを渡した場合、isSameNodeは常にfalseを返します。安全なコードのためにも、「php isnotempty」の考え方を意識し、ノードの存在確認を徹底しましょう。

PHP Dom\HTMLDocument isSameNodeでノード比較する

1<?php
2
3/**
4 * Dom\HTMLDocument::isSameNode メソッドの使用例。
5 * このメソッドは、2つのノードがDOMツリー内の「同じオブジェクト」であるかどうかをチェックします。
6 * ノードの内容や構造が同じかどうかではなく、メモリ上で全く同じインスタンスを指しているかどうかが判断基準です。
7 */
8
9// 1. Dom\HTMLDocument のインスタンスを作成し、簡単なHTMLコンテンツをロードします。
10// PHP 8 では Dom\HTMLDocument クラスが導入され、HTML ドキュメントの操作がよりシンプルになりました。
11$document = new Dom\HTMLDocument();
12$document->loadHTML('
13    <html>
14    <body>
15        <p id="first-paragraph">最初の段落</p>
16        <p id="second-paragraph">二番目の段落</p>
17    </body>
18    </html>
19');
20
21// 2. ドキュメントからいくつかのノード(HTML要素)を取得します。
22// getElementById メソッドは、指定されたIDを持つ要素ノードを返します。
23$nodeOne = $document->getElementById('first-paragraph');
24$nodeTwo = $document->getElementById('second-paragraph');
25
26// 3. 最初のノードと同じノードへの参照を別の変数に格納します。
27// これにより、$nodeOne と $nodeSame は同じ DOM オブジェクトを指すことになります。
28$nodeSame = $document->getElementById('first-paragraph');
29
30echo "--- Dom\HTMLDocument::isSameNode の動作検証 ---\n\n";
31
32// 検証 1: 同じオブジェクトを参照しているノード同士を比較
33// $nodeOne と $nodeSame はDOMツリー内の同じ <p id="first-paragraph"> 要素オブジェクトを指しています。
34// isSameNode は true を返します。
35if ($nodeOne->isSameNode($nodeSame)) {
36    echo "検証1: \$nodeOne と \$nodeSame は同じノードです。 (期待値: true)\n";
37} else {
38    echo "検証1: \$nodeOne と \$nodeSame は異なるノードです。 (期待値: false)\n";
39}
40
41echo "\n";
42
43// 検証 2: 異なるオブジェクトを参照しているノード同士を比較
44// $nodeOne と $nodeTwo はDOMツリー内の異なる <p> 要素オブジェクトを指しています。
45// isSameNode は false を返します。
46if ($nodeOne->isSameNode($nodeTwo)) {
47    echo "検証2: \$nodeOne と \$nodeTwo は同じノードです。 (期待値: false)\n";
48} else {
49    echo "検証2: \$nodeOne と \$nodeTwo は異なるノードです。 (期待値: true)\n";
50}
51
52echo "\n";
53
54// 検証 3: 1つのノードと null を比較
55// isSameNode メソッドの引数は null を許容します。
56// 比較対象が null の場合、isSameNode は常に false を返します。
57if ($nodeOne->isSameNode(null)) {
58    echo "検証3: \$nodeOne は null と同じノードです。 (期待値: false)\n";
59} else {
60    echo "検証3: \$nodeOne は null と異なるノードです。 (期待値: true)\n";
61}
62
63echo "\n";
64
65// 検証 4: $document オブジェクト自体 (これも Dom\Node の一種) と内部ノードを比較
66// $document オブジェクトと、その内部にある $nodeOne は異なるノードオブジェクトです。
67// ドキュメント自体と、その中の要素は別のオブジェクトとして扱われます。
68if ($document->isSameNode($nodeOne)) {
69    echo "検証4: \$document と \$nodeOne は同じノードです。 (期待値: false)\n";
70} else {
71    echo "検証4: \$document と \$nodeOne は異なるノードです。 (期待値: true)\n";
72}
73
74?>

Dom\HTMLDocument::isSameNode メソッドは、PHP 8で導入されたDom\HTMLDocumentクラスの機能の一つです。このメソッドは、呼び出し元のノードと引数として渡されたノードが、DOMツリー内で全く同じオブジェクトであるかどうかを厳密に比較します。ノードが持つ内容や構造が同じであるかどうかではなく、メモリ上で全く同じ実体を指している場合にのみtrueを返します。

引数$other_nodeには、比較したいDOM\Nodeオブジェクトを指定します。この引数はnullも許容されており、nullと比較した場合は常にfalseを返します。戻り値は比較結果を示すbool型で、同じオブジェクトであればtrue、そうでなければfalseとなります。

サンプルコードでは、この動作が具体的に示されています。同じIDを持つ要素を複数回取得して比較すると、これらが同じメモリ上のオブジェクトを指すためtrueとなります。一方、異なるIDを持つ要素同士を比較すると、これらは別々のオブジェクトであるためfalseを返します。また、任意のノードとnullを比較した場合や、ドキュメントオブジェクト自体と内部の要素ノードを比較した場合も、それぞれが異なるオブジェクトとして扱われるためfalseが返されます。このメソッドは、DOMノードが参照レベルで同一であるかを正確に判断する際に役立ちます。

Dom\HTMLDocument::isSameNodeは、ノードの内容や構造が同じであるかではなく、DOMツリー内で「メモリ上の全く同じオブジェクト(インスタンス)」であるかを厳密に比較するメソッドです。

そのため、たとえ見た目や内容が同じでも、cloneNodeなどで複製されたノードは異なるインスタンスとして判断される点にご注意ください。比較対象として引数にnullを渡した場合、メソッドは常にfalseを返します。このメソッドは、複雑なDOM操作において、現在参照しているノードが以前操作していたものと本当に同一であるかを厳密に確認したい場合に役立ちます。

関連コンテンツ

関連プログラミング言語