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

【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'が同じものとして扱われ、意図しない動作の原因となります。特にユーザー入力など、データ型が保証されない値を扱う際は、バグを防ぐためにこの厳密なチェックが不可欠です。サンプルコードのように、常に厳密なチェックを行う関数を独自に定義し、プロジェクト内で統一して使用することは、コードの安全性と可読性を高めるための良い実践方法と言えます。

関連コンテンツ

関連プログラミング言語