【PHP8.x】containsメソッドの使い方
containsメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
containsメソッドは、指定されたノードが現在のノードに含まれているかどうかを判定するメソッドです。DOMDocumentクラスに属し、DOMDocumentオブジェクトが保持するドキュメント構造内で、ノード間の親子関係や包含関係を検証するために使用されます。
具体的には、引数として渡されたノードが、現在のDOMDocumentオブジェクトのルートノード(ドキュメント要素)を起点とした子孫ノードである場合にtrueを返します。逆に、渡されたノードがドキュメント構造に含まれていない場合、または現在のDOMDocumentオブジェクトとは異なるドキュメントに属している場合はfalseを返します。
このメソッドは、DOM(Document Object Model)を操作する際に、特定のノードがドキュメント内に存在するかどうかを確認する上で非常に重要です。例えば、ユーザー入力に基づいて生成されたノードをドキュメントに追加する前に、そのノードがすでにドキュメント内に存在しないかを確認するために使用できます。また、イベントハンドラなどで特定の要素がドキュメントから削除されたかどうかを判定する場合にも役立ちます。
containsメソッドは、主にDOM構造の整合性を維持し、予期せぬエラーを防ぐ目的で使用されます。DOMツリーを操作するシステムエンジニアは、このメソッドを理解することで、より安全で信頼性の高いWebアプリケーションを開発することができます。引数には、検証対象のノードを指定します。返り値は、boolean型で、包含関係がある場合はtrue、そうでない場合はfalseとなります。
構文(syntax)
1DOMDocument::contains(DOMNode $node): bool
引数(parameters)
DOMNode|DOMNameSpaceNode|null $other
- DOMNode|DOMNameSpaceNode|null $other: 比較対象となるDOMNodeまたはDOMNameSpaceNodeオブジェクト、あるいはNULL
戻り値(return)
bool
指定されたDOMNodeが、このDOMDocumentのツリー構造内に含まれているかどうかを示す真偽値(trueまたはfalse)を返します。
サンプルコード
DOMDocument::contains でノードの包含関係を調べる
1<?php 2 3// DOMDocument と DOMNode を使用して、ノードがドキュメントに含まれているかどうかを確認する例 4$dom = new DOMDocument(); 5$dom->loadXML('<root><child>text</child></root>'); 6 7$childNode = $dom->getElementsByTagName('child')->item(0); 8 9// $childNode が $dom に含まれているか確認 10if ($dom->contains($childNode)) { 11 echo "childNode は DOMDocument に含まれています。\n"; 12} else { 13 echo "childNode は DOMDocument に含まれていません。\n"; 14} 15 16// 別のドキュメントのノードを作成 17$otherDom = new DOMDocument(); 18$otherDom->loadXML('<other><item>data</item></other>'); 19$otherItemNode = $otherDom->getElementsByTagName('item')->item(0); 20 21// $otherItemNode が $dom に含まれているか確認 (含まれていないはず) 22if ($dom->contains($otherItemNode)) { 23 echo "otherItemNode は DOMDocument に含まれています。\n"; 24} else { 25 echo "otherItemNode は DOMDocument に含まれていません。\n"; 26} 27 28?>
このサンプルコードは、PHPのDOMDocumentクラスのcontainsメソッドの使い方を示しています。containsメソッドは、指定されたノード(DOMNode)が、そのDOMDocumentに含まれているかどうかを調べます。引数には、確認したいノード $other を指定します。ノードが含まれていれば true、そうでなければ false を返します。
まず、DOMDocumentオブジェクトを作成し、XML文字列を読み込んでドキュメントを生成します。次に、getElementsByTagNameメソッドを使って、特定のタグ名を持つノードを取得します。
最初の例では、ドキュメント内の 'child' 要素を取得し、containsメソッドを使って、そのノードがドキュメントに含まれているかどうかを確認しています。'child'要素は最初に作成した $dom ドキュメントに含まれているため、結果は true となり、「childNode は DOMDocument に含まれています。」と表示されます。
次の例では、別の DOMDocumentオブジェクトを作成し、同様にノードを取得します。そして、最初のドキュメント($dom)のcontainsメソッドを使って、別のドキュメントから取得したノード($otherItemNode)が含まれているかどうかを確認しています。$otherItemNode は $dom ドキュメントに含まれていないため、結果は false となり、「otherItemNode は DOMDocument に含まれていません。」と表示されます。
このcontainsメソッドを使うことで、あるノードが特定のDOMDocumentに属しているかを簡単に確認することができます。
DOMDocument::contains() は、あるノードがそのドキュメントに属しているかを判定します。このメソッドは、ノードがドキュメントのツリー構造内にあるかどうかを確認するもので、ノードの値や内容を比較するものではありません。
異なる DOMDocument オブジェクトから作成されたノードを contains() で確認すると、必ず false が返ります。ノードは、それが作成されたドキュメントにのみ属するためです。
引数に null を渡すと、PHP 8.0 以降ではエラーが発生します。以前のバージョンでは true を返す可能性があるので注意が必要です。常に DOMNode または DOMNameSpaceNode オブジェクトを渡すようにしましょう。
contains() は、ノードが削除されたり、別の場所に移動されたりした場合の結果を反映します。ノードの状態が変化する可能性を考慮して使用してください。
DOMDocument::contains()でノードの包含を調べる
1<?php 2 3// DOMDocument::contains() の使用例 4 5// DOMDocumentオブジェクトを作成 6$dom = new DOMDocument(); 7 8// HTMLをロード 9$dom->loadHTML('<html><body><h1>Hello, World!</h1><p id="myParagraph">This is a paragraph.</p></body></html>'); 10 11// 比較対象のノードを取得 12$paragraph = $dom->getElementById('myParagraph'); 13 14// DOMDocumentが指定されたノードを含んでいるか確認 15if ($dom->contains($paragraph)) { 16 echo "DOMDocument contains the paragraph.\n"; 17} else { 18 echo "DOMDocument does not contain the paragraph.\n"; 19} 20 21// 存在しないノードの場合 22$newNode = new DOMElement('div'); 23if ($dom->contains($newNode)) { 24 echo "DOMDocument contains the new node.\n"; 25} else { 26 echo "DOMDocument does not contain the new node.\n"; 27} 28 29?>
PHP 8 の DOMDocument クラスにおける contains() メソッドは、DOMDocument オブジェクトが指定されたノードを含んでいるかどうかを判定します。システムエンジニアを目指す初心者の方にとって、このメソッドはDOM構造を扱う際に非常に役立ちます。
contains() メソッドは、引数として DOMNode, DOMNameSpaceNode, または null を受け取ります。この引数は、DOMDocument が含んでいるかどうかを確認したいノードを表します。null を渡すと、常に false が返されます。
戻り値は bool 型で、DOMDocument が指定されたノードを含んでいる場合は true、そうでない場合は false を返します。ノードの包含関係は、DOMツリーにおける親子関係や先祖・子孫関係によって決まります。
上記のサンプルコードでは、まず DOMDocument オブジェクトを作成し、HTMLをロードしています。次に、getElementById() メソッドを使って特定の <p> 要素(id が "myParagraph")を取得し、contains() メソッドを使って DOMDocument がその要素を含んでいるかを確認しています。結果は「DOMDocument contains the paragraph.」と表示されます。
さらに、DOMDocument に存在しない新しい <div> 要素を作成し、contains() メソッドで同様の確認を行っています。この場合は、DOMDocument は新しいノードを含んでいないため、「DOMDocument does not contain the new node.」と表示されます。
contains() メソッドを使用することで、DOM構造の整合性を確認したり、特定のノードが存在するかどうかを効率的に判断できます。これは、WebスクレイピングやXML処理などのタスクにおいて非常に有用です。
DOMDocument::contains()メソッドは、DOMDocumentオブジェクトが、引数で指定したノードを含んでいるかどうかを判定します。
注意点として、$other に渡すノードは、DOMDocument オブジェクト自身が生成したノード、またはインポートしたノードである必要があります。サンプルコードの2つ目の例のように、新たに生成したDOMElementオブジェクトを直接渡した場合、DOMDocument はそれを含んでいないため、false が返されます。
また、$other に null を渡すと、常に true が返ります。これは、null が「何もない」状態を表すため、DOMDocument が「何もないもの」を含んでいると解釈されるためです。意図しない結果にならないよう注意が必要です。