【PHP8.x】Dom\ProcessingInstruction::childNodesプロパティの使い方
childNodesプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
childNodesプロパティは、あるノードのすべての子ノードを含む Dom\NodeList オブジェクトを保持するプロパティです。このプロパティは、親クラスである Dom\Node から継承されたもので、DOMツリー構造内におけるノード間の親子関係を表現するために使用されます。Dom\NodeList は、複数のノードを順序付けて格納するコレクションであり、リスト内の各ノードにインデックス番号でアクセスしたり、ループ処理で順番に取り出したりすることが可能です。
しかし、Dom\ProcessingInstruction クラスが表す処理命令ノード(例: <?xml-stylesheet ... ?>)は、XMLやHTMLの仕様上、子ノードを持つことができないという特性があります。そのため、Dom\ProcessingInstruction オブジェクトの childNodes プロパティにアクセスした場合、返される Dom\NodeList は常に空となります。つまり、リストに含まれるノードの数は常に0です。このプロパティは読み取り専用であり、子ノードのリストを直接変更することはできません。このプロパティは、他の種類のノードとの一貫性を保つために定義されています。
構文(syntax)
1<?php 2 3$document = new \Dom\Document(); 4$document->loadXML('<?xml version="1.0"?><?php-target data?><root/>'); 5 6$processingInstructionNode = $document->firstChild; 7 8$childNodesList = $processingInstructionNode->childNodes; 9 10echo $childNodesList->length; 11 12?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
Dom\NodeList|null
Dom\NodeList|null
このプロパティは、要素の子ノードのリストをDom\NodeListオブジェクトとして返します。子ノードが存在しない場合はnullを返します。
サンプルコード
PHP DOM ProcessingInstruction childNodes の挙動
1<?php 2 3declare(strict_types=1); 4 5/** 6 * Dom\ProcessingInstructionのchildNodesプロパティの使用例です。 7 * 8 * 処理命令ノード(Processing Instruction)は、XMLの構造上、 9 * 子ノードを持つことができません。 10 * そのため、childNodesプロパティは常に null を返します。 11 * このサンプルコードでは、その動作を確認します。 12 */ 13function checkProcessingInstructionChildNodes(): void 14{ 15 // 処理命令 `<?xml-stylesheet ...?>` を含むXML文字列 16 $xml = <<<XML 17<?xml version="1.0" encoding="UTF-8"?> 18<root> 19 <?xml-stylesheet type="text/css" href="style.css"?> 20 <item>Some content</item> 21</root> 22XML; 23 24 // DOMDocumentオブジェクトを作成し、XMLを読み込む 25 $document = new \DOMDocument(); 26 $document->loadXML($xml); 27 28 // root要素のすべての子ノードをループで確認 29 foreach ($document->documentElement->childNodes as $node) { 30 // ノードが処理命令ノード (DOMProcessingInstruction) かどうかを判定 31 if ($node instanceof \DOMProcessingInstruction) { 32 echo '処理命令ノードが見つかりました: ' . $node->nodeName . PHP_EOL; 33 34 // childNodes プロパティにアクセス 35 $childNodes = $node->childNodes; 36 37 // プロパティの値が null であることを確認して表示 38 if ($childNodes === null) { 39 echo 'childNodes プロパティは null です。' . PHP_EOL; 40 } else { 41 // 処理命令ノードは子を持てないため、このブロックは実行されません 42 echo 'childNodes プロパティは null ではありません。' . PHP_EOL; 43 } 44 45 // 目的のノードを見つけたらループを終了 46 break; 47 } 48 } 49} 50 51// 関数を実行 52checkProcessingInstructionChildNodes(); 53
このPHPサンプルコードは、Dom\ProcessingInstructionクラスが持つchildNodesプロパティの動作を解説するものです。childNodesプロパティは、あるノードが持つ子ノードの一覧を取得するために使用されます。
XMLの仕様では、処理命令(Processing Instruction)と呼ばれるノード、例えば<?xml-stylesheet ...?>のようなものは、内部に子ノードを持つことができません。このルールに基づき、PHPのDom\ProcessingInstructionオブジェクトのchildNodesプロパティは、値として常にnullを返します。子ノードのリストを表すDom\NodeListオブジェクトを返すことはありません。
サンプルコードでは、まず処理命令を含むXML文字列を読み込みます。次に、そのXML文書の中から処理命令ノードを探し出します。そして、見つかった処理命令ノードのchildNodesプロパティにアクセスし、その値が仕様通りnullであることを確認して、結果を出力します。このコードを通じて、処理命令ノードが子ノードを持てないというXMLの特性と、それに伴うchildNodesプロパティの挙動を具体的に理解することができます。
Dom\ProcessingInstructionのchildNodesプロパティは、XMLの仕様上、処理命令ノード(<? ... ?>)が子ノードを持つことができないため、常にnullを返します。これは、要素ノードのchildNodesが子ノードのリストを返すのとは異なる重要な点です。そのため、このプロパティの値を利用する際は、foreachでループ処理を試みたり、lengthなどのプロパティにアクセスしたりする前に、必ずnullであるかを確認する処理が必要です。この確認を怠ると、nullに対して操作しようとしてしまい、エラーの原因となるため注意してください。