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

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

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

作成日: 更新日:

基本的な使い方

firstChildプロパティは、PHPのDOM(Document Object Model)拡張機能において、DOMTextオブジェクトの子ノードに関する情報を保持するプロパティです。DOMは、HTMLやXMLドキュメントの構造を木構造(ツリー構造)で表現し、プログラムからその内容を操作するための標準的なインターフェースです。DOMTextクラスは、このDOMツリー内で、要素の間に存在する純粋なテキストデータ、例えば<p>こんにちは</p>というHTML要素内の「こんにちは」といった部分をノードとして扱います。

通常、firstChildプロパティは親ノードの最初の子ノードを返しますが、DOMTextノードはテキストコンテンツそのものであり、それ自体がツリーの末端に位置する「葉ノード」です。つまり、テキストノードは他の要素やテキストを子として持つことはありません。

したがって、DOMTextオブジェクトのfirstChildプロパティにアクセスした場合、子ノードが存在しないため、常にnullが返されます。このプロパティは、DOMTextが継承している基底クラスであるDOMNodeから提供されていますが、DOMTextの特性上、常にnullを返すという挙動になります。DOMツリーを操作する際に、現在のノードがテキストノードであり、子を持たないことを正しく認識するために重要な情報です。

構文(syntax)

1<?php
2$domDocument = new DOMDocument();
3$textNode = $domDocument->createTextNode("Hello World");
4$firstChild = $textNode->firstChild;
5?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

DOMNode|null

DOMTextノードの最初の子ノード、または子ノードが存在しない場合はnullを返します。

サンプルコード

DOMTextのfirstChildで子ノードを確認する

1<?php
2
3// DOMText ノードの最初の子ノードを取得する例
4$dom = new DOMDocument();
5$dom->loadXML('<root><text>Hello World</text></root>');
6
7// テキストノードを取得
8$textNode = $dom->getElementsByTagName('text')->item(0)->firstChild;
9
10if ($textNode instanceof DOMText) {
11    // テキストノードの最初の子ノードは通常 null
12    $firstChild = $textNode->firstChild;
13
14    if ($firstChild === null) {
15        echo "DOMText ノードには子ノードは存在しません。\n";
16    } else {
17        echo "DOMText ノードの最初の子ノードは " . get_class($firstChild) . " です。\n";
18    }
19} else {
20    echo "テキストノードが見つかりませんでした。\n";
21}
22
23?>

このサンプルコードは、PHPのDOM拡張を用いて、DOMTextノードのfirstChildプロパティにアクセスする方法を示しています。DOMTextは、XMLドキュメント内のテキストを表すノードです。

まず、DOMDocumentクラスのインスタンスを作成し、XML文字列を読み込んでDOMドキュメントを構築します。次に、getElementsByTagName()メソッドで<text>タグのノードリストを取得し、その最初の要素のfirstChildプロパティにアクセスして、テキストノードを取得しています。

取得したノードがDOMTextのインスタンスであるかを確認した後、そのfirstChildプロパティにアクセスしています。DOMTextノードは、テキストデータそのものを保持するため、通常は子ノードを持ちません。したがって、firstChildプロパティは通常 null を返します。

サンプルコードでは、firstChildnullであるかどうかをチェックし、その結果に応じてメッセージを出力しています。firstChildプロパティは、DOMNode型またはnullを返します。DOMTextノードが子ノードを持たない場合、nullが返されることを理解しておきましょう。この例では、DOMTextが子ノードを持たないことを確認する例となっています。

DOMTextオブジェクトのfirstChildプロパティは、テキストノードの最初の子ノードを返します。テキストノードはそれ以上ノードを持てないため、通常はnullを返します。サンプルコードでは、まずDOMTextノードを取得していることを確認し、その上でfirstChildnullであることを確認しています。テキストノードに子ノードが存在しないことを前提とした処理を記述する際に、この点に注意してください。instanceofを使って型を確認することで、予期せぬエラーを防ぐことができます。

PHP DOMDocument firstChild を取得する

1<?php
2
3// DOMDocument を作成
4$dom = new DOMDocument();
5
6// HTML をロード
7$dom->loadHTML('<html><body><p>Hello, world!</p></body></html>');
8
9// body 要素を取得
10$body = $dom->getElementsByTagName('body')->item(0);
11
12// body 要素の最初の子ノード (firstChild) を取得
13$firstChild = $body->firstChild;
14
15// 最初の子ノードが null でないか確認
16if ($firstChild !== null) {
17    // 最初の子ノードの名前を出力
18    echo "First child node name: " . $firstChild->nodeName . PHP_EOL;
19} else {
20    echo "No first child found." . PHP_EOL;
21}
22
23?>

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

まず、DOMDocumentクラスのインスタンスを作成し、loadHTML()メソッドを使ってHTML文字列をロードします。次に、getElementsByTagName()メソッドでbody要素を取得し、その最初の要素をitem(0)で取り出します。

ここで、firstChildプロパティが登場します。firstChildは、対象となるノード(この例ではbody要素)の最初の子ノードを返します。もし子ノードが存在しない場合は、nullを返します。

サンプルコードでは、取得したfirstChildnullでないかを確認し、nullでなければそのノードの名前(nodeName)を出力します。nodeNameプロパティは、ノードの名前を表す文字列を返します。もしfirstChildnullであれば、「No first child found.」というメッセージを出力します。

firstChildプロパティは引数を取りません。常に、呼び出し元のノードの最初の子ノード、またはnullを返します。戻り値はDOMNode型またはnull型です。このコードを実行すると、body要素の最初の子ノードの名前であるpが出力されます。この例では<p>タグが最初の子要素にあたります。

firstChildは、指定した要素の最初の子ノードを返します。子ノードが存在しない場合はnullを返すため、必ずnullチェックを行いましょう。$body->firstChildの結果をそのまま利用すると、nullの場合にエラーが発生する可能性があります。また、firstChildはテキストノード(空白や改行も含む)も返すため、要素ノードのみを期待する場合は、instanceof演算子などで型を確認する必要があります。このサンプルコードでは、ノード名を出力する前にnullチェックを行っているため、安全に動作します。

関連コンテンツ

関連プログラミング言語