【PHP8.x】nameプロパティの使い方
nameプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
nameプロパティは、DOMAttrクラスに属する、属性の名前を保持するプロパティです。DOMAttrオブジェクトは、XML文書またはHTML文書における要素の属性を表します。このnameプロパティにアクセスすることで、その属性の名前(例えば、id、class、srcなど)を文字列として取得できます。
属性の名前は、文書構造を解析したり、特定の属性に基づいて要素を識別したりする際に重要な情報となります。nameプロパティは読み取り専用であり、属性の名前を直接変更することはできません。属性の名前を変更するには、DOMの他のメソッド(例えば、setAttributeなど)を使用する必要があります。
このプロパティは、特にXMLやHTMLの構造をプログラムで操作する際に、要素の属性を動的に処理する上で不可欠です。例えば、特定の属性を持つ要素を検索したり、属性の値に基づいて処理を分岐させたりする場合に、nameプロパティを参照して属性の名前を確認できます。
DOMAttrオブジェクトのnameプロパティを利用することで、属性の名前を簡単に取得し、XMLやHTML文書の操作を効率的に行うことができます。属性名を取得する頻度が高い処理においては、このプロパティの存在を知っていることが開発効率の向上に繋がります。属性ノードがどの名前を持っているかを把握することは、DOMを扱う上で基本的な操作の一つです。
構文(syntax)
1DOMAttr::$name;
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
DOMAttr オブジェクトの属性名を表す文字列を返します。
サンプルコード
DOMAttr::nameで属性の完全名を取得する
1<?php 2 3declare(strict_types=1); 4 5// 名前空間プレフィックス 'bk' を持つサンプルXML文字列 6$xmlString = <<<XML 7<?xml version="1.0" encoding="UTF-8"?> 8<shelf xmlns:bk="http://example.com/books"> 9 <bk:book bk:isbn="978-4-123-45678-9"> 10 <bk:title>The Art of PHP</bk:title> 11 </bk:book> 12</shelf> 13XML; 14 15// DOMDocumentオブジェクトを生成してXMLを読み込む 16$dom = new DOMDocument(); 17$dom->loadXML($xmlString); 18 19// 名前空間URIとローカル名 ('book') で要素を取得 20$namespaceURI = 'http://example.com/books'; 21$element = $dom->getElementsByTagNameNS($namespaceURI, 'book')->item(0); 22 23// 要素から名前空間を持つ属性 ('bk:isbn') をDOMAttrオブジェクトとして取得 24$attribute = $element->getAttributeNodeNS($namespaceURI, 'isbn'); 25 26// DOMAttr::name プロパティは、プレフィックスを含む完全な属性名を返します。 27// この例では 'bk:isbn' が返されます。 28echo 'Full Attribute Name (DOMAttr->name): ' . $attribute->name . PHP_EOL; 29 30// 比較のため、他の関連プロパティも表示します。 31// localName はプレフィックスを除いた名前 ('isbn') を返します。 32echo 'Local Name (DOMAttr->localName): ' . $attribute->localName . PHP_EOL; 33 34// prefix は名前空間プレフィックス ('bk') を返します。 35echo 'Namespace Prefix (DOMAttr->prefix): ' . $attribute->prefix . PHP_EOL; 36 37// value は属性の値 ('978-4-123-45678-9') を返します。 38echo 'Value (DOMAttr->value): ' . $attribute->value . PHP_EOL; 39 40?>
DOMAttrクラスのnameプロパティは、XMLなどの属性ノード(DOMAttrオブジェクト)が持つ、完全な名前を取得するためのものです。このプロパティは引数を取らず、属性名を文字列(string)として返します。
サンプルコードでは、まずxmlns:bkという名前空間プレフィックスが定義されたXML文字列をDOMDocumentオブジェクトに読み込んでいます。次に、getAttributeNodeNS()メソッドを使い、指定した名前空間に属するisbnという属性をDOMAttrオブジェクトとして取得します。
取得したオブジェクトのnameプロパティにアクセスすると、bk:isbnという文字列が得られます。これは、nameプロパティが名前空間のプレフィックスbkを含んだ、属性の完全な修飾名を返すためです。
比較として、localNameプロパティはプレフィックスを除いた部分(isbn)を、prefixプロパティはプレフィックス部分(bk)のみを返します。このようにnameプロパティは、XMLの名前空間を意識して属性名を正確に扱いたい場合に便利です。
XMLの名前空間を扱う際、DOMAttr->nameプロパティはプレフィックスを含む完全な属性名、例えば 'bk:isbn' を返します。初心者が混同しやすいのはlocalNameプロパティで、こちらはプレフィックスを除いた 'isbn' のみを返します。属性名全体が必要な場合はnameを、名前空間を意識せずに名前だけを使いたい場合はlocalNameを、というように目的応じて使い分けることが重要です。また、getAttributeNodeNSメソッドは属性が見つからない場合にnullを返すため、実際のコードでは必ずnullチェックを行い、エラーを防ぐようにしてください。名前空間URIを正しく指定して属性を取得することが、これらのプロパティを正しく利用する前提となります。
DOMAttr::name で属性名を取得する
1<?php 2 3declare(strict_types=1); 4 5namespace App\Utility; 6 7/** 8 * XML属性の情報を検査するユーティリティクラス。 9 * DOMAttr::name プロパティの使用例を示します。 10 */ 11class DomAttributeInspector 12{ 13 /** 14 * XMLドキュメントを作成し、名前空間付き属性を追加してその名前を検査します。 15 * 16 * @return string 検査結果のメッセージ 17 */ 18 public function inspectAttributeName(): string 19 { 20 // DOMDocument オブジェクトを作成します。これはXMLドキュメント全体を表します。 21 $dom = new \DOMDocument('1.0', 'UTF-8'); 22 $dom->formatOutput = true; // 出力を見やすく整形します。 23 24 // ルート要素 'root' を作成し、ドキュメントに追加します。 25 $root = $dom->createElement('root'); 26 $dom->appendChild($root); 27 28 // 名前空間とプレフィックスを持つ属性の情報を定義します。 29 $namespaceUri = 'http://example.com/ns'; 30 $qualifiedAttributeName = 'prefix:my-attribute'; // プレフィックスを含む属性名 31 $attributeValue = 'example_value'; 32 33 // ルート要素に名前空間付き属性を追加します。 34 // setAttributeNS() メソッドは、名前空間URI、限定名 (プレフィックスを含む)、属性値を受け取ります。 35 $root->setAttributeNS($namespaceUri, $qualifiedAttributeName, $attributeValue); 36 37 // 追加した属性ノードを名前空間URIとローカル名で取得します。 38 // ローカル名とは、プレフィックスを除いた属性名(例: 'my-attribute')です。 39 $attrNode = $root->getAttributeNodeNS($namespaceUri, 'my-attribute'); 40 41 $message = ''; 42 if ($attrNode instanceof \DOMAttr) { 43 // DOMAttr クラスの `name` プロパティにアクセスします。 44 // このプロパティは、属性の限定名 (例: 'prefix:my-attribute') を文字列で返します。 45 $name = $attrNode->name; 46 $localName = $attrNode->localName; // プレフィックスなしのローカル名 47 $prefix = $attrNode->prefix; // 属性のプレフィックス 48 49 $message .= "XML属性の検査結果:\n"; 50 $message .= "--------------------------------------------------\n"; 51 $message .= " DOMAttr::name プロパティの値: '{$name}'\n"; 52 $message .= " DOMAttr::localName プロパティの値: '{$localName}'\n"; 53 $message .= " DOMAttr::prefix プロパティの値: '{$prefix}'\n"; 54 $message .= "--------------------------------------------------\n"; 55 $message .= "DOMAttr::name は、XMLドキュメント内で定義された属性の\n"; 56 $message .= "プレフィックスを含む完全な名前を正確に取得します。\n"; 57 } else { 58 $message .= "指定された名前空間とローカル名を持つ属性ノードが見つかりませんでした。\n"; 59 } 60 61 return $message; 62 } 63} 64 65// スクリプトがコマンドラインインターフェース (CLI) で直接実行された場合の処理 66if (php_sapi_name() === 'cli') { 67 // DomAttributeInspector クラスのインスタンスを作成します。 68 $inspector = new App\Utility\DomAttributeInspector(); 69 70 // 属性検査メソッドを実行し、結果を出力します。 71 echo $inspector->inspectAttributeName(); 72}
DOMAttr::nameプロパティは、PHPのDOM拡張機能でXMLドキュメント内の属性(DOMAttrオブジェクト)が持つ「完全な名前」を文字列として取得します。このプロパティは引数を必要とせず、常に属性の限定名(プレフィックスを含む名前)を文字列型で返します。
サンプルコードでは、まずDOMDocumentオブジェクトを用いてXMLドキュメントを作成し、root要素にprefix:my-attributeという名前空間付きの属性を追加しています。この属性ノードをDOMAttrオブジェクトとして取得した後、そのnameプロパティにアクセスして値を取得する例を示しています。DOMAttr::nameプロパティは、属性にプレフィックスが設定されている場合、例えばprefix:my-attributeのように、そのプレフィックスを含んだ完全な名前を返します。
コード内でlocalNameプロパティ(プレフィックスを除いた名前)やprefixプロパティ(プレフィックスのみ)と比較することで、nameプロパティが提供する情報の具体的な内容を分かりやすく説明しています。このプロパティは、特にXMLドキュメントで名前空間を使用している際に、属性を正確に識別し、処理するために非常に役立ちます。XMLデータを扱うシステム開発において、属性情報を確実に取得するための基本的な機能の一つです。
DOMAttr::nameプロパティは、XML属性のプレフィックスを含む完全な名前(限定名)を文字列で返します。プレフィックスを含まない属性名が必要な場合はDOMAttr::localNameを、プレフィックスのみはDOMAttr::prefixで取得できますので、目的に応じて使い分けてください。名前空間付き属性を設定・取得する際には、setAttributeNSやgetAttributeNodeNSのように「NS」が付くメソッドを利用し、引数に名前空間URIや限定名、ローカル名を正確に指定する必要があります。特にgetAttributeNodeNSではローカル名を指定します。また、namespace宣言があるクラス内でDOMDocumentやDOMAttrなどのPHP標準クラスを使用する際は、\DOMDocumentのように頭にバックスラッシュを付けてグローバル名前空間から指定するようにしてください。取得したノードがDOMAttr型であるかinstanceofで確認することは、堅牢なコードを書く上で重要です。