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

【PHP8.x】firstChildプロパティの使い方

firstChildプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

firstChildプロパティは、ある要素の最初の子ノードを保持するプロパティです。このプロパティは、XMLやHTMLドキュメントの構造を操作する際に、特定の要素の直下にある最初のノードを取得するために使用されます。ここでいう子ノードには、<span>のような要素ノードだけでなく、要素に含まれるテキストを表すテキストノードや、<!-- コメント -->のようなコメントノードなど、さまざまな種類が含まれます。例えば、<p>テキスト</p>という要素において、firstChildプロパティは「テキスト」という内容を持つテキストノードを返します。もし対象の要素が子ノードを一切持たない場合、例えば<br><div></div>のような空の要素の場合、このプロパティの値はnullになります。取得したノードはDom\Nodeオブジェクトであるため、その種類や内容をさらに詳しく調べることが可能です。なお、このプロパティは読み取り専用であり、直接値を代入して子ノードを変更することはできません。ノードの操作にはappendChild()などの専用メソッドを使用する必要があります。

構文(syntax)

1<?php
2
3$html_string = '<div><p>最初の子ノード</p><span>二番目の子ノード</span></div>';
4
5// Dom\Documentオブジェクトを生成し、HTMLを読み込みます
6$doc = new Dom\Document();
7@$doc->loadHTML($html_string);
8
9// <div>要素を取得します
10$element = $doc->getElementsByTagName('div')[0];
11
12// firstChildプロパティを使用して、要素の最初の子ノードを取得します
13$first_node = $element->firstChild;
14
15// 取得したノードが存在する場合、そのタグ名を出力します
16if ($first_node) {
17    // 出力: p
18    echo $first_node->nodeName;
19}
20
21?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

?Dom\Node

このプロパティは、対象となる Dom\Element の最初の子ノードを返します。子ノードが存在しない場合は null が返されます。

サンプルコード

PHP DOM: documentElement の firstChild を取得する

1<?php
2
3// DomDocument を作成
4$dom = new DOMDocument();
5
6// HTML をロード
7$dom->loadHTML('<!DOCTYPE html><html><body><p>This is a paragraph.</p><div>This is a div.</div></body></html>');
8
9// ドキュメント要素を取得
10$documentElement = $dom->documentElement;
11
12// ドキュメント要素の最初の子ノードを取得
13$firstChild = $documentElement->firstChild;
14
15// 最初の子ノードが存在するか確認
16if ($firstChild) {
17    // 最初の子ノードの名前を表示
18    echo "最初の子供のノード名: " . $firstChild->nodeName . PHP_EOL;
19} else {
20    echo "最初の子ノードは存在しません。" . PHP_EOL;
21}
22
23?>

このPHPのサンプルコードは、DOMDocumentを使用してHTMLドキュメントを操作し、ルート要素の最初の子ノードを取得する方法を示しています。まず、DOMDocumentクラスの新しいインスタンスを作成し、loadHTML()メソッドを使ってHTML文字列をロードします。次に、documentElementプロパティを使用して、ドキュメントのルート要素(この例では<html>タグ)を取得します。

firstChildプロパティは、Dom\Elementクラスに属しており、要素の最初の子ノードを返します。戻り値は ?Dom\Node 型であり、子ノードが存在しない場合は null を返します。サンプルコードでは、$documentElement->firstChild を呼び出すことで、ルート要素の最初の子ノードを取得し、$firstChild 変数に格納しています。

取得したノードが存在するかどうかを if 文で確認し、存在する場合はそのノードの名前(nodeNameプロパティ)を表示します。存在しない場合は、「最初の子ノードは存在しません。」というメッセージを表示します。nodeNameプロパティは、ノードの名前を表す文字列を返します。この例では、HTMLの<html>タグ直下のノード(例えば<head><body>など)の名前が出力されます。このコードは、DOMDocumentを使ってHTML構造を解析し、特定要素の子ノードにアクセスする基本的な方法を理解するのに役立ちます。

firstChildは、指定した要素の最初の子ノードを返します。子ノードが存在しない場合はnullを返すため、戻り値の型はnullableな?Dom\Nodeとなっています。サンプルコードでは、if ($firstChild)nullチェックを行っていますが、これは非常に重要です。このチェックを怠ると、$firstChild->nodeNameにアクセスした際にエラーが発生する可能性があります。また、firstChildはテキストノードやコメントノードも返す可能性があるため、想定外のノードタイプが返ってくる場合もあります。使用する際は、nodeTypeプロパティなどでノードの種類を確認し、必要に応じて適切な処理を行うようにしてください。

PHP DOM firstChildで要素の最初の子ノードを取得する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * DOMElementのfirstChildプロパティを使用して、
7 * 要素の最初の子ノードを取得するサンプルコード。
8 */
9function showFirstChildExample(): void
10{
11    // 操作対象となるHTMLコンテンツを定義
12    // <div id="content">の最初の子ノードは<p>要素です。
13    // 要素間の改行や空白はテキストノードとして解釈される場合があるため、
14    // このサンプルではそれらをなくしています。
15    $html = <<<HTML
16    <!DOCTYPE html>
17    <html>
18    <body>
19        <div id="content"><p>最初の段落。</p><span>二番目の要素。</span></div>
20        <div id="empty"></div>
21    </body>
22    </html>
23    HTML;
24
25    // DOMDocumentオブジェクトを生成
26    $dom = new DOMDocument();
27
28    // HTMLを読み込む (HTMLの構文エラーによる警告を抑制するために@を使用)
29    @$dom->loadHTML($html);
30
31    // id="content" を持つ要素を取得
32    $element = $dom->getElementById('content');
33
34    // 要素が正しく取得できたか確認
35    if ($element instanceof DOMElement) {
36        // firstChildプロパティで最初の子ノードを取得する
37        // 戻り値の型は ?DOMNode であり、子ノードが存在しない場合はnullが返る
38        $firstChild = $element->firstChild;
39
40        // 取得した子ノードがnullでないことを確認
41        if ($firstChild !== null) {
42            // 取得したノードの情報を出力する
43            // この場合、<p>要素が取得される
44            echo "ノード名: " . $firstChild->nodeName . PHP_EOL;
45            echo "テキストコンテンツ: " . $firstChild->textContent . PHP_EOL;
46        }
47    }
48
49    // 子ノードを持たない要素で試す
50    $emptyElement = $dom->getElementById('empty');
51    if ($emptyElement instanceof DOMElement) {
52        // この場合、firstChildプロパティはnullを返す
53        if ($emptyElement->firstChild === null) {
54            echo "id='empty'の要素には子ノードがないため、firstChildはnullです。" . PHP_EOL;
55        }
56    }
57}
58
59// サンプル関数を実行
60showFirstChildExample();

このサンプルコードは、PHPのDOM拡張を用いて、HTML要素の最初の子ノードを取得する方法を示しています。具体的には、DOMElementクラスのfirstChildプロパティを使用します。

まず、DOMDocumentオブジェクトを作成し、HTML文字列を読み込みます。次に、getElementByIdメソッドで、HTML内の特定のIDを持つ要素(ここではcontentempty)を取得します。

firstChildプロパティは、要素の最初の子ノードをDOMNodeオブジェクトとして返します。もし子ノードが存在しない場合(例えばempty要素のように)、nullを返します。サンプルコードでは、firstChildで取得したノードが存在するか確認し、存在する場合はそのノードの名前(nodeName)とテキストコンテンツ(textContent)を出力します。

firstChildプロパティの戻り値はnullableなDOMNodeオブジェクト(?DOMNode)です。これは、子ノードが存在しない場合にnullを返すことを意味します。そのため、取得した値を扱う際には、nullチェックを行うことが重要です。サンプルコードでは、if ($firstChild !== null)という条件分岐でnullチェックを行っています。

この例では、content要素の最初の子ノードである<p>要素が取得され、そのノード名とテキストコンテンツが表示されます。一方、empty要素は子ノードを持たないため、firstChildnullを返し、その旨が表示されます。firstChildプロパティを使うことで、HTML構造をプログラムから操作し、特定の要素の子ノードにアクセスすることが可能です。

firstChildは要素の最初の子ノードを取得しますが、子ノードが存在しない場合はnullを返すことに注意してください。HTML内の改行や空白もテキストノードとして認識される場合があるため、意図しないノードを取得する可能性があります。loadHTML関数はHTMLの構文エラー時に警告を発生させますが、@演算子で抑制しています。本番環境ではエラーログを確認できるように、エラーハンドリングを適切に行ってください。取得したノードがnullでないことを確認してから、プロパティやメソッドにアクセスするようにしましょう。instanceofで型を確認することで、より安全なコードになります。

関連コンテンツ

関連プログラミング言語

【PHP8.x】firstChildプロパティの使い方 | いっしー@Webエンジニア