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

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

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

作成日: 更新日:

基本的な使い方

isSameNodeメソッドは、DOMNodeオブジェクトが別のDOMNodeオブジェクトと物理的に同じノードであるかどうかを判定するために実行されるメソッドです。

このメソッドの主な目的は、比較対象となる2つのDOMノードが、メモリ上で全く同じオブジェクトインスタンスを指しているかどうかを確認することです。DOM(Document Object Model)を扱う際、見た目や内容が同じように見えるノードであっても、それぞれが異なるオブジェクトとして作成されている場合があります。isSameNodeメソッドは、そのような論理的な等価性ではなく、より厳密なオブジェクトの同一性を確認するために使用されます。

使用するには、比較したい別のDOMNodeオブジェクトを引数として渡します。もし現在のDOMNodeオブジェクトと引数で指定されたDOMNodeオブジェクトが、完全に同じインスタンスであれば、このメソッドは真を意味するtrueを返します。逆に、たとえ内容が同一であっても、別々のオブジェクトとして存在する場合は偽を意味するfalseを返します。

この機能は、DOMツリーの操作において、あるノードが本当に特定のノードを参照しているか、あるいは同じノードに再度アクセスしようとしているのかを確認する際に非常に役立ちます。例えば、ノードを移動させたり削除したりする際に、誤って別のノードに影響を与えないよう、厳密なチェックを行うことができます。PHPのオブジェクト比較における===(厳密等価演算子)と似た振る舞いをしますが、isSameNodeメソッドはDOMの文脈でのノードの同一性を保証するために特化しています。

構文(syntax)

1<?php
2$dom = new DOMDocument();
3$nodeA = $dom->createElement('example');
4$nodeB = $dom->createElement('example');
5
6$nodeA->isSameNode($nodeB);

引数(parameters)

?DOMNode $otherNode

  • ?DOMNode $otherNode: 比較対象となるDOMNodeオブジェクト。nullを指定するとfalseを返します。

戻り値(return)

bool

このメソッドは、比較対象のノードが現在のノードと同一のノードである場合に true を返します。それ以外の場合は false を返します。

サンプルコード

PHP DOMNode::isSameNode でノード同一性を確認する

1<?php
2
3/**
4 * DOMNode::isSameNode メソッドのサンプルコード。
5 *
6 * この関数は、2つのDOMノードがDOMツリー内の同じノードを参照しているかを判定します。
7 * 引数として `?DOMNode` を取るため、比較対象が `null` の場合の挙動も示します。
8 */
9function demonstrateDomNodeIsSameNode(): void
10{
11    // 1. DOMDocument を作成し、XML宣言を追加
12    $dom = new DOMDocument('1.0', 'UTF-8');
13    $dom->formatOutput = true; // 出力を見やすくするため
14
15    // 2. ルート要素を作成し、DOMツリーに追加
16    $root = $dom->createElement('root');
17    $dom->appendChild($root);
18
19    // 3. 子要素を2つ作成し、DOMツリーに追加
20    $child1 = $dom->createElement('child', 'Content 1');
21    $root->appendChild($child1);
22
23    $child2 = $dom->createElement('child', 'Content 2');
24    $root->appendChild($child2);
25
26    // 4. $child1 と同じノードを参照する別の変数
27    $sameChild1Ref = $child1;
28
29    // 5. DOMツリーに追加されていない、内容が同じ別のノードを作成
30    //    これは$child1とは異なるインスタンスです。
31    $detachedChild = $dom->createElement('child', 'Content 1');
32
33    echo "--- DOMNode::isSameNode の動作確認 ---" . PHP_EOL;
34
35    // ケース1: まったく同じノードインスタンス(同じオブジェクト参照)の比較
36    // $child1 と $sameChild1Ref はメモリ上で同じオブジェクトを指しています。
37    $isSame1 = $child1->isSameNode($sameChild1Ref);
38    echo "1. \$child1 と \$sameChild1Ref は同じノードですか? " . ($isSame1 ? "はい" : "いいえ") . PHP_EOL; // 期待値: はい (true)
39
40    // ケース2: 異なるノードインスタンス(DOMツリー内で異なる位置)の比較
41    // $child1 と $child2 はDOMツリー内で異なるノードです。
42    $isSame2 = $child1->isSameNode($child2);
43    echo "2. \$child1 と \$child2 は同じノードですか?      " . ($isSame2 ? "はい" : "いいえ") . PHP_EOL; // 期待値: いいえ (false)
44
45    // ケース3: 内容は同じだが、DOMツリー内の同じノードではないインスタンスの比較
46    // $child1 と $detachedChild は見た目の内容が同じでも、DOMツリー内での参照が異なります。
47    $isSame3 = $child1->isSameNode($detachedChild);
48    echo "3. \$child1 と \$detachedChild は同じノードですか? " . ($isSame3 ? "はい" : "いいえ") . PHP_EOL; // 期待値: いいえ (false)
49
50    // ケース4: 比較対象が null の場合
51    // `isSameNode` メソッドは引数に `?DOMNode` を取るため、`null` を渡すことができます。
52    // 比較対象が `null` (存在しない/空) の場合、同じノードとは判断されず、常に `false` を返します。
53    $nullNode = null;
54    $isSame4 = $child1->isSameNode($nullNode);
55    echo "4. \$child1 と null は同じノードですか?        " . ($isSame4 ? "はい" : "いいえ") . PHP_EOL; // 期待値: いいえ (false)
56}
57
58// 関数の実行
59demonstrateDomNodeIsSameNode();
60

PHP 8のDOMNode::isSameNodeメソッドは、二つのDOMノードがDOMツリー内の「全く同じノード」であるかを判定するために使用されます。このメソッドは、引数として比較したい別のDOMノードを?DOMNode $otherNodeとして受け取ります。この?は、比較対象のノードがnull(ノードが存在しない状態)でも良いことを示しています。戻り値はbool型で、二つのノードが同じであればtrueを、そうでなければfalseを返します。

サンプルコードでは、まずDOMDocumentを作成し、ルート要素とその子要素を用意しています。 $child1$sameChild1Refは、メモリ上で同じオブジェクトを参照しているため、isSameNodetrueを返します。これは、同じノードへの参照を比較しているからです。 一方、$child1$child2は、DOMツリー内で異なる位置にある独立したノードであるため、isSameNodefalseを返します。また、内容が同じであってもDOMツリーに追加されていない$detachedChild$child1を比較した場合も、異なるノードとして扱われるためfalseとなります。 特に重要な点として、比較対象の引数にnullを渡した場合、比較対象が存在しないため、isSameNodeは常にfalseを返します。このメソッドは、DOM操作において、特定のノードが期待するノードであるかを確認する際に役立ちます。

DOMNode::isSameNodeは、2つのDOMノードがメモリ上で同じオブジェクトを指しているか、つまりDOMツリー内の全く同じノードであるかを厳密に判定します。ノードのタグ名や内容が同じであっても、異なるインスタンスであればfalseを返す点に注意が必要です。これは、値の比較ではなく、オブジェクトの同一性を確認するメソッドであることを理解してください。また、引数にnullを渡した場合、比較対象が存在しないため、常にfalseが戻り値となります。isSameNodeは、あるノードが本当にDOMツリー上の特定の位置にあるノードと同一であるかを検証したい場合に利用するのが適切です。

PHP DOMNode::isSameNode() でノード比較する

1<?php
2
3/**
4 * DOMNode::isSameNode() メソッドの使用例
5 *
6 * このメソッドは、2つのDOMノードがDOMツリー内で物理的に同じオブジェクトを
7 * 参照しているかどうかを確認します。
8 * ノードの内容や種類が同じでも、異なるオブジェクトであれば false を返します。
9 * システムエンジニアを目指す初心者の方にも理解しやすいよう、具体的な比較例を示します。
10 */
11
12// 1. DOMDocument インスタンスを作成
13// XMLドキュメントを構築するための基本オブジェクトです。
14$dom = new DOMDocument();
15
16// 2. ルート要素 (最上位の要素) を作成し、ドキュメントに追加
17// <root> という要素が作成されます。
18$rootElement = $dom->createElement('root');
19$dom->appendChild($rootElement);
20
21// 3. テキストノードを作成し、ルート要素に追加
22// <root>Hello</root> のような構造になります。
23$textNode1 = $dom->createTextNode('Hello');
24$rootElement->appendChild($textNode1);
25
26// 4. 既存のノードへの参照を取得
27// $rootElement->firstChild は、$rootElement の最初の子ノード、つまり $textNode1 を指します。
28// これは $textNode1 と同じオブジェクトを参照しています。
29$textNode1_ref = $rootElement->firstChild;
30
31// 5. 内容が同じだが、異なるオブジェクトとして新しいテキストノードを作成
32// これは $textNode1 とは別のノードオブジェクトです。
33$textNode2 = $dom->createTextNode('Hello');
34
35echo "--- DOMNode::isSameNode() の比較結果 ---\n\n";
36
37// Case 1: 同じノードオブジェクトを参照しているかを確認
38// $textNode1 と $textNode1_ref は同じオブジェクトなので、true を返します。
39echo "Case 1: \$textNode1 と \$textNode1_ref の比較\n";
40if ($textNode1->isSameNode($textNode1_ref)) {
41    echo "  -> 結果: True (\$textNode1 と \$textNode1_ref は同じノードです。)\n\n";
42} else {
43    echo "  -> 結果: False (\$textNode1 と \$textNode1_ref は異なるノードです。)\n\n";
44}
45
46// Case 2: 内容が同じでも、異なるノードオブジェクトかを確認
47// $textNode1 と $textNode2 は内容が 'Hello' で同じですが、それぞれ異なるオブジェクトとして作成されたため、false を返します。
48echo "Case 2: \$textNode1 と \$textNode2 の比較\n";
49if ($textNode1->isSameNode($textNode2)) {
50    echo "  -> 結果: True (\$textNode1 と \$textNode2 は同じノードです。)\n\n";
51} else {
52    echo "  -> 結果: False (\$textNode1 と \$textNode2 は異なるノードです。)\n\n";
53}
54
55// Case 3: 異なる種類のノード (要素とテキスト) を比較
56// $rootElement (DOMElement) と $textNode1 (DOMText) は異なる種類のノードなので、当然 false を返します。
57echo "Case 3: \$rootElement と \$textNode1 の比較\n";
58if ($rootElement->isSameNode($textNode1)) {
59    echo "  -> 結果: True (\$rootElement と \$textNode1 は同じノードです。)\n\n";
60} else {
61    echo "  -> 結果: False (\$rootElement と \$textNode1 は異なるノードです。)\n\n";
62}
63
64// Case 4: 引数に null を渡した場合の挙動
65// isSameNode メソッドは引数として null を受け入れますが、null はどの有効なノードとも同じではないため、常に false を返します。
66echo "Case 4: \$textNode1 と null の比較\n";
67if ($textNode1->isSameNode(null)) {
68    echo "  -> 結果: True (\$textNode1 と null は同じノードです。)\n\n";
69} else {
70    echo "  -> 結果: False (\$textNode1 と null は異なるノードです。)\n\n";
71}
72
73?>

PHP 8のDOMNode::isSameNode()メソッドは、二つのDOMノードがDOMツリー内で物理的に同一のオブジェクトであるかどうかを判断する際に使用されます。このメソッドを呼び出すと、自身が参照するノードと、引数として渡された$otherNodeが全く同じ実体であるかを厳密に比較し、その結果を真偽値(trueまたはfalse)で返します。

引数$otherNodeには、比較したいDOMNodeオブジェクト、またはnullを指定できます。もしnullが渡された場合、有効なノードとは同一ではないため、このメソッドは常にfalseを返します。

このメソッドが「物理的に同じ」と判断するのは、メモリ上で同じ位置を指しているような、まさに同じオブジェクトを指している場合のみです。例えば、一つのノードに対して複数の変数から参照がある場合はtrueになります。しかし、ノードの種類や内容(例えば「Hello」というテキスト)が完全に同じであっても、それぞれが独立して作成された異なるオブジェクトであればfalseを返します。異なる種類のノード(要素ノードとテキストノードなど)の比較も、常にfalseとなります。

この機能は、DOMツリーを操作する際に、特定のノードがすでに存在するか、または操作対象のノードが期待通りのものであるかを正確に確認するために役立ちます。

DOMNode::isSameNode()メソッドは、ノードの内容や種類が同じであるかではなく、メモリ上で物理的に「同じオブジェクト」を指しているかを厳密に判定します。このため、見た目上同じ内容のノードであっても、別々に生成されたオブジェクトであれば異なるものと判断され、必ずfalseを返しますので注意が必要です。引数としてnullを渡すことも可能ですが、nullは有効なDOMノードではないため、いかなるノードと比較しても常にfalseが返されます。DOMツリー内で、あるノードが本当に別のノードへの参照と同じオブジェクトであるかを確認する際に利用してください。

関連コンテンツ

関連プログラミング言語