【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 を返します。
サンプルコードでは、firstChildがnullであるかどうかをチェックし、その結果に応じてメッセージを出力しています。firstChildプロパティは、DOMNode型またはnullを返します。DOMTextノードが子ノードを持たない場合、nullが返されることを理解しておきましょう。この例では、DOMTextが子ノードを持たないことを確認する例となっています。
DOMTextオブジェクトのfirstChildプロパティは、テキストノードの最初の子ノードを返します。テキストノードはそれ以上ノードを持てないため、通常はnullを返します。サンプルコードでは、まずDOMTextノードを取得していることを確認し、その上でfirstChildがnullであることを確認しています。テキストノードに子ノードが存在しないことを前提とした処理を記述する際に、この点に注意してください。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を返します。
サンプルコードでは、取得したfirstChildがnullでないかを確認し、nullでなければそのノードの名前(nodeName)を出力します。nodeNameプロパティは、ノードの名前を表す文字列を返します。もしfirstChildがnullであれば、「No first child found.」というメッセージを出力します。
firstChildプロパティは引数を取りません。常に、呼び出し元のノードの最初の子ノード、またはnullを返します。戻り値はDOMNode型またはnull型です。このコードを実行すると、body要素の最初の子ノードの名前であるpが出力されます。この例では<p>タグが最初の子要素にあたります。
firstChildは、指定した要素の最初の子ノードを返します。子ノードが存在しない場合はnullを返すため、必ずnullチェックを行いましょう。$body->firstChildの結果をそのまま利用すると、nullの場合にエラーが発生する可能性があります。また、firstChildはテキストノード(空白や改行も含む)も返すため、要素ノードのみを期待する場合は、instanceof演算子などで型を確認する必要があります。このサンプルコードでは、ノード名を出力する前にnullチェックを行っているため、安全に動作します。