【PHP8.x】Dom\ProcessingInstruction::baseURIプロパティの使い方
baseURIプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『baseURIプロパティは、その処理命令ノード(ProcessingInstruction)が属する文書の絶対基底URIを保持するプロパティです。基底URIとは、XMLやHTML文書内において、相対パスで記述されたリソース(例: 画像ファイルや他の文書)の完全な位置を特定するための基準となるURIを指します。このプロパティの値は、主にその文書がどこから読み込まれたかによって決定されます。例えば、特定のURLから文書を読み込んだ場合はそのURLが、ローカルファイルから読み込んだ場合はそのファイルパスが基底URIの基礎となります。また、文書内でxml:base属性が指定されている場合は、その影響も受けます。このプロパティは読み取り専用であり、直接値を書き換えることはできません。文書がメモリ上の文字列から直接生成された場合など、基底URIを特定できない状況ではnullを返します。処理命令の内容に相対パスが含まれており、その参照先の正確な場所を解決する必要がある場合にこのプロパティを利用します。
構文(syntax)
1<?php 2$document = new \DOMDocument(); 3$document->loadXML('<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="style.css"?>'); 4 5$instruction = $document->childNodes[1]; 6 7$uri = $instruction->baseURI; 8 9var_dump($uri); 10?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string|null
このプロパティは、この処理命令の基となるURIを返します。URIが存在しない場合はnullを返します。
サンプルコード
PHP Dom\ProcessingInstructionのbaseURI取得
1<?php 2 3/** 4 * Demonstrates how to access the baseURI property of a Dom\ProcessingInstruction. 5 * 6 * In web contexts, the base URI helps resolve relative URIs within the document. 7 * For Dom\ProcessingInstruction nodes, baseURI typically reflects the base URI 8 * of the document they belong to. 9 */ 10function demonstrateDomProcessingInstructionBaseURI(): void 11{ 12 // Create a new DOMDocument instance. 13 // This will act as the container for our processing instruction. 14 $dom = new DOMDocument('1.0', 'UTF-8'); 15 16 // Set the documentURI to simulate the document being loaded from a specific URL. 17 // This URI will typically become the base URI for all nodes within this document, 18 // unless explicitly overridden for a specific node. 19 $dom->documentURI = 'https://example.com/path/to/document.xml'; 20 21 // Create a processing instruction node. 22 // A processing instruction (PI) is like <?target data?>. 23 // For example, <?xml-stylesheet type="text/xsl" href="style.xsl"?> 24 // The createProcessingInstruction method returns a DOMProcessingInstruction object, 25 // which in PHP 8 is compatible with Dom\ProcessingInstruction. 26 $target = 'php'; // The target of the processing instruction 27 $data = 'echo "Hello world!";'; // The data associated with the instruction 28 $processingInstruction = $dom->createProcessingInstruction($target, $data); 29 30 // Append the processing instruction to the document. 31 // This makes it part of the document structure. 32 $dom->appendChild($processingInstruction); 33 34 // Access the baseURI property of the Dom\ProcessingInstruction node. 35 // It will typically inherit the base URI from its parent document. 36 $baseURI = $processingInstruction->baseURI; 37 38 // Output the retrieved base URI. 39 if ($baseURI !== null) { 40 echo "Base URI of the Processing Instruction: " . $baseURI . PHP_EOL; 41 } else { 42 echo "Base URI of the Processing Instruction is null. " . 43 "This might happen if the node is not part of a document " . 44 "or the document's base URI is not defined." . PHP_EOL; 45 } 46} 47 48// Execute the demonstration function. 49demonstrateDomProcessingInstructionBaseURI(); 50
PHP 8のDom\ProcessingInstructionクラスは、XMLなどで使われる処理命令ノード(例えば<?xml-stylesheet ...?>のような形式)を表します。このクラスのbaseURIプロパティは、その処理命令ノードが属するドキュメントの基準となるURI(URL)を返します。このプロパティは、ドキュメント内で相対的なURIを解決する際の基点として利用されます。
baseURIプロパティは引数を取りません。戻り値は、基準URIを示す文字列(string)またはnullです。もしノードがまだドキュメントツリーに属していない場合や、ドキュメント自体にベースURIが定義されていない場合にはnullが返されます。
上記のサンプルコードでは、DOMDocumentオブジェクトを作成し、そのdocumentURIプロパティにhttps://example.com/path/to/document.xmlというURIを設定することで、ドキュメント全体の基準URIを定義しています。次に、createProcessingInstructionメソッドを使用して処理命令ノードを生成し、それをドキュメントに追加します。その後、生成した$processingInstructionオブジェクトのbaseURIプロパティにアクセスすると、ドキュメントに設定したhttps://example.com/path/to/document.xmlが取得され、出力されることを確認できます。これは、特定の処理命令ノードがどのURIを基準としているかを示すものです。
baseURIプロパティは、処理命令が属するドキュメントの基準となるURIを示します。これは、ドキュメント内で相対パスが記述された場合に、そのパスを解決するための基点となるURLです。サンプルコードのように、DOMDocumentのdocumentURIを設定すると、それがそのドキュメント内の各ノードのbaseURIに継承されることに注意が必要です。処理命令ノード自体が直接URLを持つわけではありません。
このプロパティはstringまたはnullを返す可能性があるため、アクセスする際は常にnullチェックを行うようにしてください。ノードがまだドキュメントに追加されていない場合や、親となるドキュメントのdocumentURIが設定されていない場合などにはnullが返されることがあります。相対パスを正確に解決するために、このbaseURIの値は非常に重要です。
PHPで処理命令のbaseURIを取得する
1<?php 2 3/** 4 * 指定されたXML文字列からDom\ProcessingInstructionノードを検索し、そのbaseURIプロパティを返します。 5 * 6 * @param string $xmlString 処理命令を含むXML文字列 7 * @return string|null 処理命令ノードのbaseURI、または処理命令が見つからないかbaseURIが利用できない場合はnull 8 */ 9function getProcessingInstructionBaseUri(string $xmlString): ?string 10{ 11 // DOMDocument オブジェクトを作成します。 12 $dom = new DOMDocument(); 13 14 // XML文字列をDOMドキュメントとして読み込みます。 15 // このメソッドは、メモリ上の文字列からドキュメントを生成します。 16 // PHP 8では、パースエラーが発生した場合にDOMExceptionをスローする可能性があります。 17 try { 18 $dom->loadXML($xmlString); 19 } catch (DOMException $e) { 20 // XMLのパースエラーが発生した場合、処理命令の取得はできません。 21 return null; 22 } 23 24 // ドキュメント内のすべての子ノードを調べます。 25 // ProcessingInstructionは通常、ドキュメントのルート要素の前(XML宣言の後)に配置されます。 26 foreach ($dom->childNodes as $node) { 27 // ノードが Dom\ProcessingInstruction のインスタンスであるか確認します。 28 if ($node instanceof Dom\ProcessingInstruction) { 29 // Dom\ProcessingInstruction クラスの baseURI プロパティは、 30 // そのノードの基準となるURIを返します。 31 // メモリ上で作成されたXMLの場合、通常は null となります。 32 // これは、そのノードが特定のファイルパスに関連付けられていないためです。 33 // もしXMLがファイルからロードされた場合、そのファイルのURIが返されることがあります。 34 return $node->baseURI; 35 } 36 } 37 38 // 処理命令ノードが見つからなかった場合 39 return null; 40} 41 42// サンプルXML文字列を定義します。 43// ここでは、XML宣言の後に処理命令(processing instruction)を含めています。 44// この例では、一般的なPHPの処理命令に似た形式ですが、DOMにおいてはXML標準の処理命令として扱われます。 45$sampleXml = '<?xml version="1.0" encoding="UTF-8"?>' . 46 '<?php echo "Hello from PI"; ?>' . // これがDom\ProcessingInstructionとして扱われます 47 '<root>' . 48 ' <data>サンプルデータ</data>' . 49 '</root>'; 50 51// 関数を実行し、処理命令のbaseURIを取得します。 52$baseUri = getProcessingInstructionBaseUri($sampleXml); 53 54// 結果を出力します。 55if ($baseUri === null) { 56 echo "処理命令のbaseURIは利用できませんでした。(通常、メモリ上のXMLではnullとなります)\n"; 57} else { 58 echo "処理命令のbaseURI: " . $baseUri . "\n"; 59} 60 61?>
このPHPサンプルコードは、XMLドキュメント内の「処理命令(Processing Instruction)」ノードから、その基準URI(baseURI)を取得する方法を示します。Dom\ProcessingInstructionクラスのbaseURIプロパティは、ノードの元となるURIを示しますが、通常、メモリ上で作成されたXMLからはnullが返されます。
getProcessingInstructionBaseUri関数はXML文字列$xmlStringを引数に、DOMDocumentでXMLを解析します。エラー時はnullを返します。次に、解析されたドキュメントの子ノードを巡回し、Dom\ProcessingInstruction型のノードを探します。該当ノードが見つかると、そのbaseURIプロパティの値が戻り値となります。戻り値はstringまたはnullです。baseURIは、XMLがファイルからロードされた場合はそのファイルのURIを返すことがありますが、メモリ上のXMLではURIがないためnullが返されます。また、処理命令ノードが見つからない場合も関数はnullを返します。
サンプルコードでは、XML宣言の後に<?php ... ?>形式の処理命令を含むXML文字列を定義し、この関数を実行しています。結果として「処理命令のbaseURIは利用できませんでした。(通常、メモリ上のXMLではnullとなります)」と出力され、メモリ上のXMLでのbaseURIの挙動を確認できます。
このサンプルコードでは、メモリ上のXML文字列から処理命令ノードのbaseURIプロパティを取得していますが、通常、メモリ上で作成されたXMLの場合、baseURIはnullとなります。これは、XMLノードが特定のファイルパスに関連付けられていないためです。もしXMLがファイルからロードされた場合は、そのファイルのURIが返されることがあります。
Dom\ProcessingInstructionは、<?php ... ?>のようなPHPタグに似ていますが、これはXML標準の処理命令であり、PHPコードが実行されるわけではありません。
DOMDocument::loadXML()メソッドは、PHP 8でXMLパースエラーが発生した際にDOMExceptionをスローする可能性があるため、安全なコードのためにtry-catchブロックでエラーを捕捉することが重要です。
このbaseURIは、Webアプリケーションで一般的に言われる「ベースURL」とは異なり、XMLノードが由来する元のリソースのURIを示すものです。システム全体のURLを取得する目的とは異なりますので、混同しないようご注意ください。