【PHP8.x】DOMDocument::documentURIプロパティの使い方
documentURIプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
documentURIプロパティは、DOMDocumentオブジェクトが扱うドキュメントのURI(Uniform Resource Identifier)を保持するプロパティです。
このプロパティを使用すると、XMLやHTMLなどのドキュメントがどこから読み込まれたのか、その元の場所を示すURI情報を取得できます。具体的には、DOMDocumentオブジェクトがload()やloadHTMLFile()などのメソッドを用いて外部リソースからドキュメントを読み込んだ際に、そのリソースのURIが自動的に設定されます。例えば、ファイルシステム上のXMLファイルを読み込んだ場合はそのファイルのパスが、ウェブサイトのHTMLを読み込んだ場合はそのURLが格納されます。
ドキュメントがまだ読み込まれていない場合や、ドキュメントのソースURIが不明な場合はnullを返します。このdocumentURIプロパティは読み取り専用であり、プログラムから直接その値を変更することはできません。
ドキュメントの出所を確認したい場合や、ドキュメント内の相対パスを解決するための基準として利用できます。これにより、セキュリティチェックや関連リソースの正確な参照に役立ち、DOM操作におけるドキュメントのコンテキストを把握するために重要な情報を提供します。
構文(syntax)
1<?php 2$dom = new DOMDocument(); 3$uri = $dom->documentURI; 4?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
?string
DOMDocumentオブジェクトで読み込まれたドキュメントのURI(Uniform Resource Identifier)を表す文字列です。ドキュメントがURIを持たない場合はnullが返されます。
サンプルコード
DOMDocument::documentURI を理解する
1<?php 2 3/** 4 * DOMDocument::documentURI プロパティのデモンストレーション。 5 * 6 * この関数は、DOMDocument オブジェクトがXML/HTMLドキュメントを読み込んだ際の 7 * documentURI プロパティの挙動を示します。 8 * documentURI は、ドキュメントの場所を示す URI (Uniform Resource Identifier) を返します。 9 * ドキュメントがファイルからロードされた場合はそのファイルのURIを、 10 * そうでない場合(メモリ上で新規作成された場合など)は null を返します。 11 * 12 * システムエンジニアを目指す初心者の方にも理解しやすいよう、 13 * ファイルからロードした場合としない場合の両方のケースを示します。 14 * 15 * @return void 16 */ 17function demonstrateDocumentURI(): void 18{ 19 echo "--- DOMDocument::documentURI プロパティのデモンストレーション ---\n\n"; 20 21 // 1. ファイルからロードしない DOMDocument の場合 22 echo "ケース1: ファイルからロードしないDOMDocument\n"; 23 $domWithoutFile = new DOMDocument(); 24 echo " - documentURI の値: "; 25 // この場合、ドキュメントはメモリ上で作成されたため、URIは存在しません。 26 var_dump($domWithoutFile->documentURI); // null が出力されます。 27 echo "\n"; 28 29 // 2. ファイルからロードする DOMDocument の場合 30 echo "ケース2: ファイルからロードするDOMDocument\n"; 31 32 // デモンストレーション用に一時的なHTMLファイルを作成します。 33 $tempFilePath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'sample_document.html'; 34 $htmlContent = '<!DOCTYPE html><html><head><title>サンプル</title></head><body><h1>こんにちは!</h1></body></html>'; 35 36 // ファイルにコンテンツを書き込みます。 37 if (file_put_contents($tempFilePath, $htmlContent) === false) { 38 echo " - エラー: 一時ファイルの作成に失敗しました。\n"; 39 return; 40 } 41 echo " - 一時ファイルを作成しました: " . $tempFilePath . "\n"; 42 43 $domWithFile = new DOMDocument(); 44 // 作成したHTMLファイルをロードします。 45 if ($domWithFile->loadHTMLFile($tempFilePath)) { 46 echo " - HTMLファイルを正常にロードしました。\n"; 47 echo " - documentURI の値: "; 48 // この場合、ドキュメントはファイルからロードされたため、ファイルのURIが返されます。 49 var_dump($domWithFile->documentURI); // ファイルのURI (例: file:///tmp/sample_document.html) が出力されます。 50 } else { 51 echo " - エラー: HTMLファイルのロードに失敗しました。\n"; 52 } 53 echo "\n"; 54 55 // 後処理: 作成した一時ファイルを削除します。 56 if (file_exists($tempFilePath)) { 57 unlink($tempFilePath); 58 echo "--- 後処理: 一時ファイルを削除しました ---\n"; 59 } 60} 61 62// 関数を実行してデモンストレーションを開始します。 63demonstrateDocumentURI(); 64
PHPのDOMDocument::documentURIプロパティは、XMLやHTMLドキュメントがロードされた場所を示すURI(Uniform Resource Identifier)を取得するために使用されます。このプロパティは引数を取りません。
戻り値は?string型であり、ドキュメントのURIが存在する場合は文字列として返され、URIが存在しない場合(例えば、ドキュメントがメモリ上で新規作成された場合など)はnullが返されます。
具体的な挙動として、まずDOMDocumentオブジェクトがファイルからロードされていない場合、documentURIプロパティはnullを返します。これはサンプルコードの「ケース1」で示されており、新しく作成されたDOMDocumentのdocumentURIがnullになることが確認できます。
一方、DOMDocumentオブジェクトがファイル、例えばHTMLファイルからロードされた場合、documentURIはそのファイルの絶対URIを文字列として返します。サンプルコードの「ケース2」では、一時的なHTMLファイルを作成し、それをloadHTMLFile()メソッドで読み込むことで、documentURIがそのファイルのURI文字列を返すことが確認できます。このプロパティは、ドキュメントの起源を特定する際に役立ちます。
DOMDocument::documentURIプロパティは、ドキュメントがファイルから読み込まれた場合にそのURIを返しますが、メモリ上で新規作成された場合はnullを返します。そのため、このプロパティを利用する際は、返り値がnullである可能性を考慮し、必ずnullチェックを行うことで予期せぬエラーを防ぐようにしてください。返される値は通常のファイルパスではなく、file:///で始まるURI形式である点にも留意が必要です。サンプルコードの一時ファイルの作成・削除処理はデモンストレーション目的のためです。実際のアプリケーションで外部ファイルを扱う際は、ファイルパスの妥当性検証やエラーハンドリングを適切に行い、セキュリティと安定性を確保することが重要です。
PHP DOMDocument::documentURIでドキュメントパスを取得する
1<?php 2 3/** 4 * DOMDocument::documentURI プロパティの使用例 5 * システムエンジニアを目指す初心者向けに、WebサーバーのドキュメントルートとURIの関連性を示します。 6 * 7 * documentURI は、DOMDocument オブジェクトがロードしたドキュメントのURI (Uniform Resource Identifier) を返します。 8 * ファイルからドキュメントをロードした場合、通常はそのファイルの絶対パスがURIとして返されます。 9 */ 10function demonstrateDocumentURIWithDocumentRoot(): void 11{ 12 // WebサーバーのDOCUMENT_ROOTを取得します。 13 // $_SERVER['DOCUMENT_ROOT'] は、通常、Webサイトの公開ディレクトリ(ドキュメントルート)を指します。 14 // ただし、コマンドラインからスクリプトを実行した場合や、Webサーバーの設定によっては 15 // この変数が設定されていないことがあります。 16 // その場合は、現在のスクリプトが配置されているディレクトリ (__DIR__) を代替として使用します。 17 $documentRootPath = $_SERVER['DOCUMENT_ROOT'] ?? __DIR__; 18 19 echo "スクリプトが想定するベースパス: " . $documentRootPath . "\n\n"; 20 21 // ドキュメントルート(または代替パス)内に一時的なHTMLファイルを作成します。 22 // このファイルを DOMDocument でロードし、documentURI がどのように機能するかを確認します。 23 $tempFileName = 'example_document_root_file.html'; 24 // パスを正しく結合するために、末尾のディレクトリセパレータを削除してから追加します。 25 $tempFilePath = rtrim($documentRootPath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $tempFileName; 26 27 // 作成するHTMLの内容 28 $htmlContent = <<<HTML 29<!DOCTYPE html> 30<html> 31<head> 32 <title>DOMDocument::documentURI Example</title> 33</head> 34<body> 35 <h1>Hello from the Document Root!</h1> 36 <p>This is a sample HTML file to demonstrate documentURI.</p> 37</body> 38</html> 39HTML; 40 41 // 一時HTMLファイルを書き込みます。失敗した場合はエラーメッセージを表示して終了します。 42 if (file_put_contents($tempFilePath, $htmlContent) === false) { 43 echo "エラー: 一時HTMLファイルの作成に失敗しました: " . $tempFilePath . "\n"; 44 return; 45 } 46 47 echo "一時HTMLファイルを作成しました: " . $tempFilePath . "\n\n"; 48 49 // DOMDocument オブジェクトを作成 50 $dom = new DOMDocument(); 51 52 // HTMLのパース中に発生する可能性のある警告を抑制します。 53 // これは、特に厳密でないHTMLを扱う場合に役立ちます。 54 libxml_use_internal_errors(true); 55 56 // 作成したHTMLファイルを DOMDocument にロードします。 57 // loadHTMLFile() メソッドは、指定されたファイルのパスからドキュメントをロードします。 58 if ($dom->loadHTMLFile($tempFilePath)) { 59 echo "HTMLファイルを正常にロードしました。\n"; 60 61 // DOMDocument::documentURI プロパティの値を取得して表示します。 62 // loadHTMLFile() でファイルからロードした場合、documentURI はそのファイルの絶対パスを返します。 63 // 戻り値の型は ?string (string または null) なので、null の可能性も考慮して出力します。 64 $documentUri = $dom->documentURI; 65 66 echo "DOMDocument::documentURI の値: " . ($documentUri ?? 'NULL (ドキュメントURIが設定されていません)') . "\n"; 67 } else { 68 echo "エラー: HTMLファイルのロードに失敗しました。\n"; 69 } 70 71 // libxmlのエラー状態をクリアし、元の設定に戻します (任意ですが、他のライブラリへの影響を避けるために推奨されます) 72 libxml_clear_errors(); 73 libxml_use_internal_errors(false); 74 75 // 作成した一時ファイルを削除します。 76 if (file_exists($tempFilePath)) { 77 unlink($tempFilePath); 78 echo "\n一時HTMLファイルを削除しました: " . $tempFilePath . "\n"; 79 } 80} 81 82// 上記の関数を実行します。 83demonstrateDocumentURIWithDocumentRoot(); 84 85?>
DOMDocument::documentURIは、DOMDocumentオブジェクトが現在ロードしているドキュメントのURI(Uniform Resource Identifier)を返すプロパティです。このプロパティは引数を取らず、戻り値の型は?stringであり、文字列またはnullが返される可能性があります。
このサンプルコードでは、Webサーバーの公開ディレクトリ(ドキュメントルート)を想定した場所に一時的なHTMLファイルを作成し、それをDOMDocumentにロードしてdocumentURIの挙動を確認しています。DOMDocument::loadHTMLFile()メソッドでファイルをロードした場合、documentURIプロパティは、ロードされたファイルの絶対パスをURIとして返します。これにより、Webサーバー環境において、ファイルシステム上の物理的なパスがURIとしてどのように扱われるかを示しています。
documentURIプロパティは、外部リソースから読み込んだXMLやHTMLドキュメントの元の場所を知りたい場合に役立ち、特に相対パス解決の基準となるURIを確認する際に利用できます。
documentURIはDOMDocumentがロードしたドキュメントの絶対URI(通常はファイルパス)を返しますが、情報がない場合はnullになる可能性がありますので、その有無を常に確認して処理してください。
$_SERVER['DOCUMENT_ROOT']はWebサーバー環境でしか設定されないため、コマンドライン実行時などでは未定義の場合があります。そのような場合に備え、__DIR__のような代替パスを用意し、あらゆる実行環境で動作するよう考慮することが重要です。
ファイルパスを結合する際は、オペレーティングシステムに依存しないDIRECTORY_SEPARATOR定数を適切に使用し、一時ファイルの作成や削除などのファイル操作では、必ずエラー処理を実装してください。
libxml_use_internal_errors(true)でHTMLパース時の警告を抑制できますが、重要な問題を見過ごすリスクもあるため、デバッグ時には注意し、利用後はlibxml_use_internal_errors(false)で元の状態に戻すことを推奨します。