【PHP8.x】DOMNotation::contains()メソッドの使い方
containsメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
containsメソッドは、指定したノードが現在処理しているDOMNotationノードの子孫であるかどうかを判定するメソッドです。このメソッドは、すべてのDOMノードの基本となる親クラスDOMNodeから継承された機能です。一般的に、あるノードに対してcontainsメソッドを使用すると、引数で渡された別のノードが、そのノードの階層構造内、つまり子や孫ノードとして含まれているかを調べることができます。含まれている場合はtrueを、含まれていない場合はfalseを返します。しかし、DOMの仕様上、DOMNotationノードは子ノードを持つことができません。これは、DOMNotationがDTD(文書型定義)内で宣言された記法そのものを表すための特殊なノードであり、子要素を持つことを想定していないためです。したがって、DOMNotationオブジェクトに対してこのメソッドを呼び出した場合、引数にどのようなノードを指定しても、そのノードが子孫であることはありえないため、結果は常にfalseとなります。このメソッドはクラスの継承関係によって存在しますが、DOMNotationの文脈においては実質的に使用される場面はありません。
構文(syntax)
1<?php 2$xmlString = <<<XML 3<?xml version="1.0" encoding="UTF-8"?> 4<!DOCTYPE root [ 5 <!NOTATION notation1 PUBLIC "public_id_1"> 6 <!NOTATION notation2 PUBLIC "public_id_2"> 7]> 8<root/> 9XML; 10 11$doc = new DOMDocument(); 12$doc->validateOnParse = true; 13$doc->loadXML($xmlString); 14 15// DOMNotation オブジェクトを取得 16$notation = $doc->doctype->notations->getNamedItem('notation1'); 17$otherNode = $doc->doctype->notations->getNamedItem('notation2'); 18 19// $notation が $otherNode を子孫として含むか判定します。 20$isContained = $notation->contains($otherNode); 21 22var_dump($isContained); 23?>
引数(parameters)
?DOMNode $other
- ?DOMNode $other: 比較対象となるDOMNodeオブジェクト
戻り値(return)
bool
指定された文字列がDOMNotationオブジェクト内に含まれているかどうかを真偽値(trueまたはfalse)で返します。
サンプルコード
PHPで配列に値が含まれるか確認する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 指定された値が配列内に存在するかどうかを確認します。 7 * 8 * この関数は、PHPの組み込み関数 in_array() のラッパーとして機能し、 9 * 配列内に特定の要素が含まれているか(contains)をチェックする一般的な方法を示します。 10 * 11 * @param array<int|string, mixed> $haystack 検索対象の配列。 12 * @param mixed $needle 検索する値。 13 * @return bool 値が配列内に見つかった場合は true、それ以外は false を返します。 14 */ 15function doesArrayContainValue(array $haystack, mixed $needle): bool 16{ 17 // in_array()関数は、配列に値が存在するかどうかをチェックします。 18 // 第3引数に true を指定すると、型も比較する厳密なチェック (===) を行います。 19 // PHP 8以降では、この厳密なチェックが推奨されます。 20 return in_array($needle, $haystack, true); 21} 22 23// チェック対象の配列を定義します。 24$fruits = ['apple', 'banana', 'orange']; 25 26// --- ケース1: 配列に存在する値を確認 --- 27$value1 = 'banana'; 28if (doesArrayContainValue($fruits, $value1)) { 29 echo "'{$value1}' は配列に含まれています。" . PHP_EOL; 30} else { 31 echo "'{$value1}' は配列に含まれていません。" . PHP_EOL; 32} 33 34// --- ケース2: 配列に存在しない値を確認 --- 35$value2 = 'grape'; 36if (doesArrayContainValue($fruits, $value2)) { 37 echo "'{$value2}' は配列に含まれています。" . PHP_EOL; 38} else { 39 echo "'{$value2}' は配列に含まれていません。" . PHP_EOL; 40} 41 42// --- ケース3: 型が異なる値を確認(厳密なチェック) --- 43$numbers = [10, 20, '30']; 44$value3 = 30; // データ型は integer 45if (doesArrayContainValue($numbers, $value3)) { 46 echo "数値の {$value3} は配列に含まれています。" . PHP_EOL; 47} else { 48 // 配列内の '30' は文字列型なので、厳密な比較では false となります。 49 echo "数値の {$value3} は配列に含まれていません。(文字列の '30' は存在します)" . PHP_EOL; 50} 51 52?>
このPHPサンプルコードは、配列の中に特定のデータが含まれているかどうかを確認する方法を解説しています。そのために doesArrayContainValue という独自の関数を定義し、具体的な使用例を示しています。
この関数は2つの引数を取ります。第1引数の $haystack は検索対象となる配列で、第2引数の $needle はその配列の中から探したい値です。関数の内部では、PHPに標準で用意されている in_array() 関数を呼び出しています。このコードの重要な点は、in_array() の第3引数に true を指定していることです。これにより、値が一致するかに加えて、データ型(例えば数値と文字列の違い)まで一致するかどうかを厳密に比較します。
関数の戻り値は bool 型(ブール型)であり、$needle で指定した値が配列内に見つかった場合は true を、見つからなかった場合は false を返します。サンプルコードの最後の例では、数値の 30 と文字列の '30' が厳密に区別されるため、検索結果が false となることを示しており、正確なデータ検索におけるこの手法の有効性がわかります。
このコードの最も重要な点は、in_array関数の第3引数にtrueを指定し、厳密な型比較を行っていることです。これを指定しない場合、例えば数値の30と文字列の'30'が同じものとして扱われ、意図しない動作の原因となります。特にユーザー入力など、データ型が保証されない値を扱う際は、バグを防ぐためにこの厳密なチェックが不可欠です。サンプルコードのように、常に厳密なチェックを行う関数を独自に定義し、プロジェクト内で統一して使用することは、コードの安全性と可読性を高めるための良い実践方法と言えます。