【PHP8.x】Dom\ProcessingInstruction::contains()メソッドの使い方
containsメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
containsメソッドは、引数で指定されたノードが、このメソッドを呼び出した処理命令ノードの子孫であるかどうかを判定する処理を実行するメソッドです。DOMのツリー構造内でのノード間の包含関係を確認するために使用されます。このメソッドは、比較対象となるノードオブジェクトを引数として受け取ります。もし引数で渡されたノードが、メソッドを呼び出した処理命令ノードの子孫である場合、結果として真偽値のtrueを返します。また、比較対象として自分自身のノードを指定した場合も、自身を含んでいると見なされるためtrueが返されます。一方で、引数のノードが子孫ではない場合、または引数がnullである場合にはfalseが返されます。この機能により、XMLやHTMLドキュメントの構造を動的に解析し、特定のノードが別のノードの内部に存在するかどうかを簡単かつ確実にチェックすることが可能になります。
構文(syntax)
1public function contains(?Dom\Node $other): bool
引数(parameters)
?Dom\Node $other
- ?Dom\Node $other: 比較対象となるノードを指定します。このノードが現在のプロセッシングインストラクションに含まれているかどうかを判定します。
戻り値(return)
bool
指定された文字列が、このProcessingInstructionノードのデータに含まれているかどうかを真偽値で返します。
サンプルコード
PHP配列に値が含まれるか確認する
1<?php 2 3/** 4 * 指定された値が配列内に存在するかどうかを確認し、結果を表示します。 5 * 6 * この関数は、PHPで配列に特定の要素が含まれているか(contains)を 7 * 調べる最も一般的な方法である `in_array()` の使い方を示します。 8 * 9 * @param array<int, string> $searchArray 検索対象の配列 10 * @param string $searchValue 検索する値 11 * @return void 12 */ 13function checkValueInArray(array $searchArray, string $searchValue): void 14{ 15 // in_array() 関数は、配列内に指定した値が存在するかどうかをチェックします。 16 // 第1引数: 検索する値 17 // 第2引数: 検索対象の配列 18 // 戻り値: 値が存在すれば true、存在しなければ false を返します。 19 if (in_array($searchValue, $searchArray, true)) { 20 echo "配列に '{$searchValue}' は含まれています。" . PHP_EOL; 21 } else { 22 echo "配列に '{$searchValue}' は含まれていません。" . PHP_EOL; 23 } 24} 25 26// チェック対象のサンプル配列 27$colors = ['red', 'green', 'blue']; 28 29// ケース1: 配列に含まれている値をチェック 30checkValueInArray($colors, 'green'); 31 32// ケース2: 配列に含まれていない値をチェック 33checkValueInArray($colors, 'yellow'); 34 35?>
このPHPサンプルコードは、配列の中に特定のデータが含まれているかどうかを判定する、基本的で重要な方法を示しています。containsという名前の機能は様々な場面で使われますが、このサンプルではPHPの配列を対象に、特定の値が含まれているか(contains)を確認する一般的な手法を解説します。
コードの中心となっているのはin_array()というPHPの標準関数です。この関数は、指定した値が配列内に存在するかどうかをチェックします。第1引数には検索したい値を、第2引数には検索対象の配列を指定します。値が見つかった場合はtrueを、見つからなかった場合はfalseという真偽値(bool)を返します。サンプルコードのif文は、この戻り値を利用して処理を分岐させ、結果に応じたメッセージを表示する仕組みです。また、in_array()の第3引数にtrueを指定すると、値だけでなくデータ型も一致しているかを厳密に比較するため、より正確な判定が可能です。このようにin_array()関数を使うことで、PHPの配列要素を簡単かつ安全に検索できます。
このサンプルコードの注意点は、in_array 関数の第3引数に true を指定していることです。これにより、値だけでなくデータ型も一致するかを厳密にチェックします。この指定を省略すると、例えば数値の 0 と空でない文字列が等しいと判定されるなど、意図しない結果を招く可能性があるため、true を指定することが推奨されます。また、この関数は配列の「値」の存在を確認するものであり、「キー」の存在を調べる array_key_exists とは役割が異なります。大文字と小文字も区別されるため、検索する際には注意が必要です。
PHP Dom\ProcessingInstruction::contains を使う
1<?php 2 3/** 4 * Dom\ProcessingInstruction::contains の使用例を示す関数 5 * 6 * この関数は、XMLドキュメント内の処理命令ノード (ProcessingInstruction) が、 7 * 別のノードを子孫として含んでいるかどうかを判定します。 8 * 処理命令ノードは子ノードを持つことができないため、このメソッドは常に false を返します。 9 */ 10function demonstrateProcessingInstructionContains(): void 11{ 12 // XML文字列を準備します。処理命令(<?xml-stylesheet ...?>)を含みます。 13 $xmlString = <<<XML 14<?xml version="1.0" encoding="UTF-8"?> 15<?xml-stylesheet type="text/css" href="style.css"?> 16<document> 17 <element>Some text</element> 18</document> 19XML; 20 21 // DOMDocumentオブジェクトを作成し、XMLを読み込みます。 22 $doc = new DOMDocument(); 23 $doc->loadXML($xmlString); 24 25 // 処理命令ノード(Dom\ProcessingInstruction)を取得します。 26 // $doc->childNodes[0] は <?xml ...?>、[1] が <?xml-stylesheet ...?> です。 27 $piNode = $doc->childNodes[1]; 28 29 // 比較対象として、ルート要素ノード(<document>)を取得します。 30 $elementNode = $doc->documentElement; 31 32 // 処理命令ノードがルート要素を子孫として含むかを確認します。 33 // 処理命令ノードは子を持つことができないため、結果は常に false になります。 34 $isContained = $piNode->contains($elementNode); 35 36 // 結果を出力します。 37 echo 'Is the <document> element contained within the <?xml-stylesheet ...?> processing instruction?' . PHP_EOL; 38 var_dump($isContained); // bool(false) が出力されます 39 40 // 自分自身を引数にした場合も確認します。 41 // ノードが自身を含むと見なされるため、この場合は true を返します。 42 $isSelfContained = $piNode->contains($piNode); 43 echo PHP_EOL; 44 echo 'Is the processing instruction contained within itself?' . PHP_EOL; 45 var_dump($isSelfContained); // bool(true) が出力されます 46} 47 48// 関数を実行します。 49demonstrateProcessingInstructionContains(); 50
Dom\ProcessingInstruction::contains()メソッドは、ある処理命令ノードが、引数で指定された別のノードを子孫として含んでいるかどうかを判定します。
引数には、判定対象となるDom\Nodeオブジェクトを指定します。メソッドの呼び出し元である処理命令ノードが、この引数のノードを子孫として含んでいればtrueを、そうでなければfalseを返します。
XMLのルール上、処理命令ノード(例: <?xml-stylesheet ...?>)は子要素やテキストノードなどを持つことができません。このため、contains()メソッドの挙動は特殊です。引数に自分自身以外のノードを指定した場合、それを子孫として持つことは構造的にありえないため、結果は常にfalseとなります。
ただし、唯一の例外として、引数に自分自身のノードオブジェクトを指定した場合は、そのノードは自身を含んでいると見なされるため、trueが返されます。このメソッドは、処理命令ノードの構造的な制約をコード上で確認する際に利用できます。
Dom\ProcessingInstruction::containsメソッドは、処理命令ノードが子ノードを持てないというXMLのルールから、特別な挙動をします。このため、引数に自分自身以外のノードを指定した場合、そのノードがXML文書内で子孫のように見えても、結果は常にfalseとなります。唯一trueが返るのは、引数に自分自身のノードインスタンスを渡した場合です。これは、ノードは自身を含むと定義されているためです。また、サンプルコードのようにインデックス番号でノードを取得する方法は、XMLの構造が変わると意図しないノードを指す可能性があるため、実際の開発ではより確実な方法でノードを特定することが重要です。