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

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

作成日: 更新日:

基本的な使い方

firstChildプロパティは、Dom\Attr クラスの属性ノードが持つ最初の子ノードを保持するプロパティです。このプロパティは、属性ノードの構造を解析し、その子ノードにアクセスするために使用されます。具体的には、属性の値が複数のノード(テキストノードや要素ノードなど)で構成されている場合に、それらの最初のノードを取得できます。

Dom\Attr クラスは、HTMLやXMLドキュメントの属性を表すためのクラスです。属性は要素の一部であり、要素の特性や値を指定するために使用されます。firstChild プロパティは、属性の値が単純な文字列だけでなく、より複雑な構造を持つ場合に特に役立ちます。

例えば、属性の値が複数のテキストノードで構成されている場合、firstChild プロパティを使用することで、最初のテキストノードにアクセスできます。さらに、最初のノードが要素ノードである場合、その要素ノードのプロパティやメソッドを使用して、より詳細な情報を取得できます。

このプロパティは読み取り専用であり、値を直接設定することはできません。属性ノードの子ノードを変更するには、DOMDocument クラスのメソッドや他の DOMNode クラスのメソッドを使用する必要があります。属性ノードに子ノードが存在しない場合、firstChild プロパティは null を返します。この点に注意して、プログラムを記述する必要があります。firstChildプロパティの利用は、属性の値を構成するノードを順番に処理する際の出発点として役立ちます。

構文(syntax)

1readonly public ?Dom\Node $firstChild;

引数(parameters)

引数なし

引数はありません

戻り値(return)

DOMNode|null

このプロパティは、要素の最初の子ノードを表します。子ノードが存在しない場合は、null が返されます。

サンプルコード

PHP DomAttr firstChild 取得

1<?php
2
3// DOMDocumentを新規作成
4$dom = new DOMDocument();
5
6// ルート要素を作成
7$root = $dom->createElement('root');
8$dom->appendChild($root);
9
10// 子要素を2つ作成
11$child1 = $dom->createElement('child1');
12$child2 = $dom->createElement('child2');
13
14// ルート要素に子要素を追加
15$root->appendChild($child1);
16$root->appendChild($child2);
17
18// 属性を持つ要素を作成
19$attrOwner = $dom->createElement('attrOwner');
20$root->appendChild($attrOwner);
21
22// 属性を作成し、要素に追加
23$attr = $dom->createAttribute('testAttr');
24$attr->value = 'testValue';
25$attrOwner->setAttributeNode($attr);
26
27// 属性ノードを取得
28$testAttrNode = $attrOwner->getAttributeNode('testAttr');
29
30// 属性ノードのfirstChildプロパティにアクセス
31if ($testAttrNode && $testAttrNode->firstChild) {
32    echo "firstChild: " . $testAttrNode->firstChild->nodeValue . PHP_EOL;
33} else {
34    echo "firstChild is null." . PHP_EOL;
35}
36
37// 属性ノードを削除
38$attrOwner->removeAttributeNode($testAttrNode);
39
40// 属性ノードを取得
41$testAttrNode = $attrOwner->getAttributeNode('testAttr');
42
43// 属性ノードのfirstChildプロパティにアクセス
44// 削除されているのでNULLになる
45if ($testAttrNode && $testAttrNode->firstChild) {
46    echo "firstChild: " . $testAttrNode->firstChild->nodeValue . PHP_EOL;
47} else {
48    echo "firstChild is null." . PHP_EOL;
49}
50?>

このPHPサンプルコードは、Dom\AttrクラスのfirstChildプロパティの動作を理解するためのものです。firstChildプロパティは、属性ノード(DOMAttrオブジェクト)が持つ最初の子ノードを返します。通常、属性ノードの値はテキストノードとして表現されるため、firstChildはテキストノードを指します。もし属性ノードが子ノードを持たない場合、firstChildnullを返します。

サンプルコードでは、まずDOMDocumentオブジェクトを作成し、要素や属性を操作してDOMツリーを構築しています。具体的には、attrOwnerという要素にtestAttrという属性を追加し、その値をtestValueに設定しています。

その後、getAttributeNodeメソッドで属性ノードを取得し、そのfirstChildプロパティにアクセスしています。最初に属性が存在するときは、firstChildはテキストノード(値はtestValue)を指し、そのノードの値が表示されます。

次に、removeAttributeNodeメソッドで属性ノードを削除しています。削除後、再度getAttributeNodeで属性ノードを取得すると、属性ノード自体が存在しないため、firstChildプロパティはnullを返します。そのため、「firstChild is null.」と表示されます。

このサンプルを通して、属性ノードにおけるfirstChildプロパティの役割と、属性の削除がfirstChildに与える影響を確認できます。システムエンジニアを目指す上で、DOM構造の理解は重要であり、このサンプルはその一助となるでしょう。

Dom\AttrクラスのfirstChildプロパティは、属性ノードの最初の子ノードを取得します。属性ノードの場合、通常、子ノードは属性値を持つテキストノードのみです。もし属性が定義されていない、または削除された場合、getAttributeNode()nullを返し、firstChildプロパティへのアクセスはエラーの原因となるため、事前にnullチェックが必要です。サンプルコードでは、if ($testAttrNode && $testAttrNode->firstChild)nullチェックを行っています。属性を削除すると、getAttributeNode()nullを返すため、その後のfirstChildへのアクセスはnullチェックを通過せず、"firstChild is null."と表示されます。属性ノードの構造を理解し、存在を確認してからfirstChildにアクセスすることが重要です。

PHP DOMAttr firstChild プロパティを取得する

1<?php
2
3/**
4 * Dom\Attr クラスの firstChild プロパティの使用方法をデモンストレーションします。
5 *
6 * Dom\Attr (PHP 8では DOMAttr クラスのエイリアス) の firstChild プロパティは、
7 * 属性の値がテキストノードとして存在する場合に、そのテキストノードを返します。
8 * 属性に値がない場合は null を返します。
9 * システムエンジニアを目指す初心者向けに、具体的なコード例で動作を説明します。
10 */
11function demonstrateDomAttrFirstChild(): void
12{
13    // 1. 新しい DOMDocument インスタンスを作成
14    // XML バージョン 1.0、エンコーディング UTF-8 を指定
15    $dom = new DOMDocument('1.0', 'UTF-8');
16    $dom->formatOutput = true; // 出力を見やすく整形するために設定
17
18    // 2. ルート要素 'root' を作成し、ドキュメントに追加
19    $rootElement = $dom->createElement('root');
20    $dom->appendChild($rootElement);
21
22    // 3. 'data-id' という名前の属性を作成し、値を設定
23    $attributeName = 'data-id';
24    $attributeValue = 'unique-item-123';
25    $domAttrNode = $dom->createAttribute($attributeName);
26    $domAttrNode->nodeValue = $attributeValue; // 属性にテキスト値を設定
27
28    // 4. ルート要素に属性ノードを追加
29    $rootElement->appendChild($domAttrNode);
30
31    echo "--- Dom\\Attr::firstChild プロパティのデモンストレーション ---" . PHP_EOL;
32    echo "作成した属性: {$attributeName}=\"{$attributeValue}\"" . PHP_EOL;
33    echo PHP_EOL;
34
35    // 5. DOMElement から Dom\Attr (DOMAttr) インスタンスを取得
36    // getAttributeNode() メソッドを使用して、指定された属性名の Dom\Attr オブジェクトを取得します。
37    $attrInstance = $rootElement->getAttributeNode($attributeName);
38
39    // 属性インスタンスが正しく取得できたか確認
40    if ($attrInstance === null) {
41        echo "エラー: 属性 '{$attributeName}' が見つかりませんでした。" . PHP_EOL;
42        return;
43    }
44
45    // 6. Dom\Attr インスタンスの firstChild プロパティにアクセス
46    // 属性の firstChild は、通常、属性の値を保持する DOMText ノードになります。
47    $firstChildNode = $attrInstance->firstChild;
48
49    echo "属性 '{$attributeName}' の firstChild プロパティにアクセスしました。" . PHP_EOL;
50
51    // 7. firstChild が存在するかどうかを確認し、その情報を表示
52    if ($firstChildNode !== null) {
53        echo "  -> firstChild は存在します。" . PHP_EOL;
54        echo "  -> ノードタイプ名: " . $firstChildNode->nodeName . PHP_EOL;    // #text を出力
55        echo "  -> ノード値: " . $firstChildNode->nodeValue . PHP_EOL;       // 属性の値を抽出
56        echo "  -> ノードタイプコード: " . $firstChildNode->nodeType . " (DOM_TEXT は 3)" . PHP_EOL;
57    } else {
58        echo "  -> firstChild は null です。(属性に値がない場合など)" . PHP_EOL;
59    }
60
61    echo PHP_EOL;
62
63    // 8. 値が空の属性の場合も確認
64    echo "--- 値が空の属性の場合の Dom\\Attr::firstChild ---" . PHP_EOL;
65    $emptyAttributeName = 'data-empty';
66    $emptyDomAttrNode = $dom->createAttribute($emptyAttributeName);
67    // 値を設定しないため、属性は空になります。
68    $rootElement->appendChild($emptyDomAttrNode);
69
70    $emptyAttrInstance = $rootElement->getAttributeNode($emptyAttributeName);
71    if ($emptyAttrInstance !== null) {
72        $emptyFirstChildNode = $emptyAttrInstance->firstChild;
73        if ($emptyFirstChildNode !== null) {
74            echo "属性 '{$emptyAttributeName}' の firstChild は存在します。" . PHP_EOL;
75        } else {
76            echo "属性 '{$emptyAttributeName}' の firstChild は null です。" . PHP_EOL;
77        }
78    }
79}
80
81// 関数を実行してデモンストレーションを開始
82demonstrateDomAttrFirstChild();

Dom\AttrクラスのfirstChildプロパティは、属性ノードの最初の子ノードを返します。PHP8ではDOMAttrクラスのエイリアスです。通常、属性の値はテキストノードとして表現されるため、firstChildはテキストノードを返します。属性に値が設定されていない場合や、子ノードが存在しない場合はnullを返します。

サンプルコードでは、まずDOMDocumentを作成し、ルート要素にdata-idという属性を追加しています。getAttributeNode()メソッドで属性ノードを取得し、firstChildプロパティにアクセスしています。属性の値がテキストノードとして存在するため、firstChildはテキストノードを返します。ノード名(#text)、ノードの値(属性値)、ノードタイプ(3)を確認できます。

次に、値が空の属性data-emptyを作成し、同様にfirstChildを確認しています。この場合、属性に値がないため、firstChildnullを返します。firstChildプロパティを利用することで、属性の値にアクセスしたり、属性が空かどうかを判断したりできます。

Dom\Attr::firstChildは属性ノードが持つ最初の子ノード(通常はテキストノード)を返します。属性値が存在しない場合、nullを返すことに注意してください。

getAttributeNode()で属性を取得する際、属性名の大文字小文字は区別されます。存在しない属性名を指定するとnullが返るので、必ず存在チェックを行いましょう。

firstChildが返すノードはDOMText型であり、nodeValueプロパティで属性値を取得できます。属性値が空文字列の場合でもfirstChildnullではなく、空のDOMTextノードを返します。属性が存在しない場合と、属性値が空の場合を混同しないようにしましょう。

サンプルコードでは、属性値が存在する場合と存在しない場合の両方でfirstChildの動作を確認しています。

関連コンテンツ

関連プログラミング言語