【PHP8.x】childNodesプロパティの使い方
childNodesプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
childNodesプロパティは、DOMCharacterDataオブジェクトのすべての子ノードを保持する読み取り専用のDOMNodeListオブジェクトを返します。
DOMCharacterDataは、テキストノード(DOMText)、コメントノード(DOMComment)、処理命令ノード(DOMProcessingInstruction)といった、文字データを含むノードの抽象基底クラスです。これらのノードは、XMLやHTMLドキュメントの構造を表現するDOM(Document Object Model)ツリーの一部を構成します。
childNodesプロパティは、これらのDOMCharacterDataオブジェクトが直接的な子ノードを持つことはないため、常に空のDOMNodeListを返します。これは、DOMCharacterDataオブジェクトがテキストデータなどを保持するリーフノードとして扱われるためです。子ノードの概念は、要素ノード(DOMElement)などの、他のノードを子として持つことができるノードに適用されます。
したがって、DOMCharacterDataオブジェクトのchildNodesプロパティにアクセスしても、DOMCharacterDataオブジェクトが保持するテキストデータ自体が子ノードとして返されるわけではありません。あくまで、空のリストが返されるという点に注意が必要です。DOMCharacterDataが保持するテキストデータにアクセスする場合は、dataプロパティを使用します。childNodesプロパティはDOMNodeインターフェースから継承されていますが、DOMCharacterDataにおいては常に空のリストを返すという特殊な挙動をします。
構文(syntax)
1DOMCharacterData::$childNodes;
引数(parameters)
引数なし
引数はありません
戻り値(return)
DOMNodeList | null
DOMCharacterDataオブジェクトが持つ子ノードのリスト、または子ノードがない場合はnullを返します。
サンプルコード
PHP DOM childNodesで子ノードを取得する
1<?php 2 3/** 4 * DOMCharacterDataクラスのchildNodesプロパティの動作を示すサンプルコードです。 5 * 6 * DOMCharacterDataは、DOMTextやDOMCommentのような文字データを含むノードの基底クラスです。 7 * これらのノードはDOMツリーにおける「葉」ノードであり、通常、それ自体は子ノードを持ちません。 8 * そのため、childNodesプロパティは常に空のDOMNodeListを返します。 9 */ 10function demonstrateDomCharacterDataChildNodes(): void 11{ 12 // DOMDocumentを作成します。これはDOMツリーのルートとなるオブジェクトです。 13 $dom = new DOMDocument('1.0', 'UTF-8'); 14 15 // DOMCharacterDataのサブクラスであるDOMTextノードを作成します。 16 // テキストノードは文字データのみを持ち、子ノードは持ちません。 17 $textNode = $dom->createTextNode('これはテキストデータです。'); 18 19 echo "--- DOMText ノードの childNodes プロパティ ---" . PHP_EOL; 20 // DOMTextノードの子ノードリストを取得します。 21 // DOMCharacterData::childNodes は DOMNodeList または null を返します。 22 $textChildNodes = $textNode->childNodes; 23 24 // 戻り値がDOMNodeListのインスタンスであるかを確認します。 25 if ($textChildNodes instanceof DOMNodeList) { 26 echo " 戻り値の型: DOMNodeList" . PHP_EOL; 27 echo " 子ノードの数: " . $textChildNodes->length . PHP_EOL; 28 if ($textChildNodes->length === 0) { 29 echo " DOMTextノードは子ノードを持たないため、結果は空のリストです。" . PHP_EOL; 30 } 31 } elseif ($textChildNodes === null) { 32 // リファレンスには null の可能性も示されていますが、通常は発生しません。 33 echo " 戻り値の型: null (まれなケース)" . PHP_EOL; 34 } else { 35 echo " 予期しない戻り値の型です。" . PHP_EOL; 36 } 37 echo PHP_EOL; 38 39 // DOMCharacterDataの別のサブクラスであるDOMCommentノードでも確認します。 40 // コメントノードも文字データのみを持ち、子ノードは持ちません。 41 $commentNode = $dom->createComment('これはコメントデータです。'); 42 43 echo "--- DOMComment ノードの childNodes プロパティ ---" . PHP_EOL; 44 // DOMCommentノードの子ノードリストを取得します。 45 $commentChildNodes = $commentNode->childNodes; 46 47 // 戻り値がDOMNodeListのインスタンスであるかを確認します。 48 if ($commentChildNodes instanceof DOMNodeList) { 49 echo " 戻り値の型: DOMNodeList" . PHP_EOL; 50 echo " 子ノードの数: " . $commentChildNodes->length . PHP_EOL; 51 if ($commentChildNodes->length === 0) { 52 echo " DOMCommentノードは子ノードを持たないため、結果は空のリストです。" . PHP_EOL; 53 } 54 } elseif ($commentChildNodes === null) { 55 echo " 戻り値の型: null (まれなケース)" . PHP_EOL; 56 } else { 57 echo " 予期しない戻り値の型です。" . PHP_EOL; 58 } 59} 60 61// 関数を実行して、DOMCharacterDataのchildNodesプロパティの動作を確認します。 62demonstrateDomCharacterDataChildNodes(); 63
PHPのDOM拡張機能において、DOMCharacterDataクラスは、XMLやHTMLドキュメント内で純粋な文字データ(テキストやコメントなど)を表現するノードの基底クラスです。このクラスは、DOMTextやDOMCommentといった、具体的な文字データを持つノードの共通の親となります。
childNodesプロパティは、あるノードが持つ直接の子ノードのリストを取得するために使用されます。このプロパティは引数を取らず、戻り値としてDOMNodeListまたはまれにnullを返します。通常、DOMNodeListは子ノードの集合であり、そのlengthプロパティで子ノードの数を取得できます。
しかし、DOMCharacterDataを継承するノードは、それ自体が子ノードを持つことができない「葉」ノードの性質を持っています。そのため、DOMTextやDOMCommentノードに対してchildNodesプロパティにアクセスすると、常に子ノードが一つも含まれていない、空のDOMNodeListが返されます。これにより、これらのノードが構造的な子要素を持たないことが明確に示されます。例えば、サンプルコードではDOMTextノードとDOMCommentノードの両方で、childNodesプロパティがlengthが0のDOMNodeListを返すことを確認しています。
DOMCharacterDataクラスは、テキストやコメントといった文字データを扱うノードの基底クラスです。これらのノードは構造的に子ノードを持つことができないため、childNodesプロパティを参照すると、常に要素数がゼロの空のDOMNodeListが返されます。サンプルコードのように、返されたDOMNodeListのlengthプロパティがゼロであることを確認するのが一般的です。リファレンスには戻り値としてnullの可能性も示されていますが、通常のPHPのDOM操作ではほとんどの場合、要素が空のDOMNodeListが返されるため、その点を意識しておくと良いでしょう。DOMElementのような子ノードを持つ可能性のあるノードと混同しないよう注意し、DOMCharacterDataの子ノード探索に不必要なロジックを組まないようにすることが安全な利用につながります。