【PHP8.x】DOMEntity::contains()メソッドの使い方
containsメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
containsメソッドは、指定したノードがこのエンティティノードの子孫であるかどうかを判定するメソッドです。DOMツリーと呼ばれる、XMLやHTML文書の階層構造内において、あるノードが別のノードの内側に含まれているかという包含関係を調べるために使用されます。ここでいう「子孫」とは、直接の子ノードだけでなく、孫ノードやそれ以降のさらに深い階層に存在するすべてのノードを含みます。メソッドの引数に調査対象のノードオブジェクトを渡すと、そのノードがメソッドを呼び出したノードの子孫であればtrueを、そうでなければfalseを返します。なお、ノード自身を引数に渡した場合も、自分自身を含んでいるとみなされtrueが返ります。このメソッドを利用することで、文書内の特定の要素が期待通りの場所に配置されているかを確認したり、親子関係に基づいた処理を実装したりする際に役立ちます。
構文(syntax)
1public DOMNode::contains(?DOMNode $other): bool
引数(parameters)
DOMNode|null $other
- DOMNode|null $other: 検索対象となる別のDOMNodeオブジェクト、またはnull
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP配列に値が含まれるか確認する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 配列に指定された値が含まれているかを確認し、結果を表示します。 7 * 8 * @param mixed $targetValue 検索する値 9 * @param array<int|string, mixed> $haystackArray 検索対象の配列 10 */ 11function checkIfValueExistsInArray(mixed $targetValue, array $haystackArray): void 12{ 13 // 配列の内容と検索する値を分かりやすく表示 14 echo '配列: [' . implode(', ', $haystackArray) . "]\n"; 15 echo "検索する値: " . var_export($targetValue, true) . "\n"; 16 17 // in_array()関数を使用して、配列内に値が存在するかどうかをチェックします。 18 // 第1引数: 検索する値 ($targetValue) 19 // 第2引数: 検索対象の配列 ($haystackArray) 20 // 第3引数(true): 型も比較する厳密なチェックを行う (例: 1 と "1" は別物とみなす) 21 if (in_array($targetValue, $haystackArray, true)) { 22 echo "結果: この値は配列内に存在します。\n"; 23 } else { 24 echo "結果: この値は配列内に存在しません。\n"; 25 } 26 27 echo "--------------------\n"; 28} 29 30// チェック対象のサンプル配列を定義します 31$programmingLanguages = ['PHP', 'JavaScript', 'Python', 'Java']; 32 33// ケース1: 配列に存在する値を検索 34checkIfValueExistsInArray('Python', $programmingLanguages); 35 36// ケース2: 配列に存在しない値を検索 37checkIfValueExistsInArray('Ruby', $programmingLanguages); 38 39// ケース3: 数値の配列で検索 40$numbers = [1, 2, 3, 4, 5]; 41checkIfValueExistsInArray(3, $numbers); 42 43// ケース4: 厳密なチェックにより、型が違うため「存在しない」と判定されるケース 44// '3' (文字列) は 3 (整数) とは異なります。 45checkIfValueExistsInArray('3', $numbers); 46
このPHPサンプルコードは、配列の中に特定のデータが存在するかどうかを確認する方法を解説しています。主にin_array()というPHPの標準関数を使用します。この関数は、第1引数に検索したい値、第2引数に検索対象となる配列を指定すると、値が存在すればtrue(真)、存在しなければfalse(偽)を返します。サンプルコードでは、第3引数にtrueを指定して「厳密な比較」を行っています。これにより、値だけでなくデータ型まで一致しているかを判定するため、例えば数値の3と文字列の'3'は区別されます。コード内のcheckIfValueExistsInArrayという関数は、このin_array()の結果を使って、検索対象の値と配列の内容、そして検索結果を画面に分かりやすく表示する役割を担っています。この関数自体は結果を表示するだけで、特定の値を返しません。サンプルでは、文字列や数値の配列を使って、値が存在する場合、存在しない場合、そしてデータ型が異なるために存在しないと判定される場合の具体的な動作を示しています。
このコードで最も重要なのは、in_array関数の第3引数にtrueを指定している点です。これにより、値だけでなくデータ型も一致するかを調べる「厳密な比較」が行われます。これを省略したりfalseにしたりすると、例えば数値の3と文字列の'3'が同じものと判定され、意図しないバグの原因になることがあります。安全なコードを書くためには、常に厳密な比較を意識することが重要です。また、この関数は文字列の大文字と小文字を区別するため、'PHP'と'php'は別の値として扱われます。大文字・小文字を区別せずに検索したい場合は、比較前に値を変換する工夫が必要です。
PHP DOMNode::contains()で包含関係を調べる
1<?php 2 3/** 4 * DOMノードの包含関係をチェックするサンプルコードです。 5 * PHP 8で追加されたDOMNode::contains()メソッドを使用します。 6 * DOMEntityクラスはDOMNodeを継承しているため、DOMEntityのインスタンスもこのメソッドを呼び出すことができます。 7 * このメソッドは、指定されたノードがレシーバーノードの子孫であるか、またはレシーバーノード自身である場合にtrueを返します。 8 */ 9function checkNodeContainsExample(): void 10{ 11 // 新しいDOMDocumentを作成し、HTMLを読み込みます。 12 $dom = new DOMDocument(); 13 // HTMLの構文エラーを避けるため、シンプルな構造にしています。 14 $dom->loadHTML(' 15 <div id="parent"> 16 <span id="child">Hello</span> 17 <p>World</p> 18 </div> 19 <div id="unrelated_parent"> 20 <strong id="unrelated_child">Goodbye</strong> 21 </div> 22 '); 23 24 // ID属性を使用して特定の要素を取得します。 25 $parent = $dom->getElementById('parent'); 26 $child = $dom->getElementById('child'); 27 $unrelatedChild = $dom->getElementById('unrelated_child'); 28 29 // 必要なDOM要素がすべて取得できたか確認します。 30 if (!$parent || !$child || !$unrelatedChild) { 31 echo "エラー: 必要なDOM要素のいずれかが見つかりませんでした。\n"; 32 return; 33 } 34 35 // 1. $parent ノードが $child ノードを含んでいるか確認します。 36 // DOMNode::contains()メソッドはブール値 (true/false) を返します。 37 $result1 = $parent->contains($child); 38 echo "親ノード ('<div id=\"parent\">') は子ノード ('<span id=\"child\">') を含んでいますか? " . var_export($result1, true) . "\n"; // 出力: true 39 40 // 2. $child ノードが $parent ノードを含んでいるか確認します (逆の関係)。 41 $result2 = $child->contains($parent); 42 echo "子ノード ('<span id=\"child\">') は親ノード ('<div id=\"parent\">') を含んでいますか? " . var_export($result2, true) . "\n"; // 出力: false 43 44 // 3. $parent ノードが自分自身を含んでいるか確認します。 45 $result3 = $parent->contains($parent); 46 echo "親ノード ('<div id=\"parent\">') は自分自身を含んでいますか? " . var_export($result3, true) . "\n"; // 出力: true 47 48 // 4. $parent ノードが $unrelatedChild ノードを含んでいるか確認します。 49 // $unrelatedChild は $parent とは別のDOMツリーのブランチにあります。 50 $result4 = $parent->contains($unrelatedChild); 51 echo "親ノード ('<div id=\"parent\">') は無関係なノード ('<strong id=\"unrelated_child\">') を含んでいますか? " . var_export($result4, true) . "\n"; // 出力: false 52} 53 54// 定義した関数を実行します。 55checkNodeContainsExample();
PHP 8で追加されたDOMNode::contains()メソッドは、DOMツリーにおけるノード間の包含関係を効率的にチェックするための機能です。DOMEntityクラスもDOMNodeを継承しているため、そのインスタンスでこのメソッドを呼び出すことができます。このメソッドは、呼び出し元のノードが、引数で指定したDOMNodeを子孫として含んでいるか、または引数ノードが呼び出し元ノード自身であるかを判定します。
引数$otherには、包含関係を調べたい対象のDOMNodeオブジェクト、またはnullを渡します。戻り値はブール値で、もし呼び出し元のノードが引数で渡されたノードを含んでいる場合(子孫であるか、または自身である場合)はtrueを返し、それ以外の場合はfalseを返します。
サンプルコードでは、シンプルなHTML構造を持つDOMDocumentを作成し、getElementById()で特定の要素を取得しています。そして、親要素が子要素を含んでいるか、子要素が親要素を含んでいるか(逆の関係)、要素が自分自身を含んでいるか、さらには全く関係のない要素を含んでいるかといった、様々なケースでcontains()メソッドの結果を確認しています。これにより、実際にどのような場合にtrueが返され、どのような場合にfalseが返されるのかを具体的に理解することができます。このメソッドは、複雑なDOM操作において、特定の位置にある要素の存在確認などに役立ちます。
DOMEntity::contains()メソッドは、指定されたノードがレシーバーノードの子孫か、または自身であるかを真偽値で判定します。このメソッドはPHP 8で導入されたため、古いPHPバージョンでは利用できません。getElementById()などでDOM要素を取得する際は、対象が見つからない場合にnullが返されることがあります。メソッド呼び出し前にnullチェックを行うことで、プログラムが予期せぬエラーで停止するのを防ぎ、安全に利用できます。contains()メソッドは、レシーバー自身やその子孫ノードに対してのみtrueを返し、それ以外の親ノードや全く関係ないノードに対してはfalseを返しますので、この包含関係の定義を理解して活用してください。