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

【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\ProcessingInstructionchildNodesプロパティは、XMLの仕様上、処理命令ノード(<? ... ?>)が子ノードを持つことができないため、常にnullを返します。これは、要素ノードのchildNodesが子ノードのリストを返すのとは異なる重要な点です。そのため、このプロパティの値を利用する際は、foreachでループ処理を試みたり、lengthなどのプロパティにアクセスしたりする前に、必ずnullであるかを確認する処理が必要です。この確認を怠ると、nullに対して操作しようとしてしまい、エラーの原因となるため注意してください。

関連コンテンツ

関連プログラミング言語