【PHP8.x】Dom\DocumentType::baseURIプロパティの使い方
baseURIプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
baseURIプロパティは、Dom\DocumentTypeオブジェクトが表すDOCTYPE宣言のベースURIを保持するプロパティです。
Dom\DocumentTypeクラスは、HTMLやXMLドキュメントの先頭に記述されるDOCTYPE宣言、例えば <!DOCTYPE html> や <!DOCTYPE root SYSTEM "document.dtd"> のような情報をカプセル化したものです。このbaseURIプロパティは、このDOCTYPE宣言が属するドキュメント、またはこのノード自体が読み込まれた際の基準となるURI(Uniform Resource Identifier)を文字列として提供します。
システムエンジニアを目指す初心者の方にも分かりやすく説明しますと、「ベースURI」とは、ウェブページやXMLドキュメント内で使われる相対的なパス(例えば、「images/logo.png」のようなファイル名だけを記述したパス)を、実際にアクセス可能な絶対的なアドレス(例えば、「http://www.example.com/images/logo.png」のような完全なアドレス)に変換するための出発点となる情報のことです。
このプロパティの値を参照することで、あるDom\DocumentTypeノードが、具体的にどの場所(URI)を基準として読み込まれたのか、あるいはそのノードが属するドキュメント全体の相対URIを解決するための基準URIが何であるかを正確に把握することができます。これは、特に外部リソースを参照するXMLドキュメントなどをPHPで処理する際に、適切なパス解決を行う上で重要な情報となる場合があります。このプロパティは読み取り専用であり、その値はドキュメントのロード時に自動的に設定されます。
構文(syntax)
1<?php 2 3// 一時ファイルを作成し、XMLコンテンツを保存します。 4// このファイルパスがDOMDocumentのbaseURIとなり、DocumentTypeにも継承されます。 5$tempFile = sys_get_temp_dir() . '/example_doc_type.xml'; 6file_put_contents($tempFile, '<!DOCTYPE example_doc SYSTEM "example.dtd"><root/>'); 7 8// DOMDocumentオブジェクトを作成し、一時ファイルをロードします。 9$dom = new DOMDocument(); 10$dom->load($tempFile); 11 12// ドキュメントタイプノードを取得します。 13// これはDom\DocumentTypeクラスのインスタンスとなります。 14$documentType = $dom->doctype; 15 16// ドキュメントタイプノードが存在する場合、baseURIプロパティにアクセスします。 17// baseURIは、このノードが属するドキュメントのベースURIを返します。 18if ($documentType) { 19 echo $documentType->baseURI; 20} 21 22// 作成した一時ファイルを削除します。 23unlink($tempFile); 24 25?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
Dom\DocumentType クラスの baseURI プロパティは、このドキュメントタイプノードの基底 URI を表す文字列を返します。
サンプルコード
PHP Dom\DocumentType baseURI を取得する
1<?php 2 3/** 4 * Dom\DocumentType クラスの baseURI プロパティの使用例を示します。 5 * 6 * baseURI プロパティは、特定のDOMノード(この場合は文書型ノード)が属する文書の 7 * 基準URI(Uniform Resource Identifier)を返します。 8 * このURIは、文書内の相対パスを解決するための基準として使用されます。 9 * 10 * PHPの Dom\Document->loadHTML() メソッドで文字列からHTMLをロードした場合、 11 * 明示的にベースURIが設定されない限り、baseURIプロパティは通常、空文字列 ('') を返します。 12 */ 13function demonstrateDocumentTypeBaseURI(): void 14{ 15 // Dom\DocumentType オブジェクトを取得するために、 16 // <!DOCTYPE html> 宣言を含むHTML文書のサンプル文字列を定義します。 17 $htmlContent = <<<HTML 18<!DOCTYPE html> 19<html> 20<head> 21 <title>サンプル文書</title> 22</head> 23<body> 24 <h1>DOM DocumentType baseURI の例</h1> 25 <p>この文書はPHPスクリプト内の文字列からロードされています。</p> 26</body> 27</html> 28HTML; 29 30 // 新しい Dom\Document オブジェクトを作成します。 31 $dom = new DOM\Document(); 32 33 // HTML文字列をDOMツリーとしてロードします。 34 // HTMLのパース中に発生する可能性のある警告を抑制し、処理後にクリアします。 35 libxml_use_internal_errors(true); 36 $dom->loadHTML($htmlContent); 37 libxml_clear_errors(); 38 39 // ドキュメントの DocumentType ノードを取得します。 40 // HTMLに <!DOCTYPE ...> 宣言が存在しない場合、このプロパティは null になります。 41 $documentTypeNode = $dom->doctype; 42 43 // DocumentType ノードが正常に取得できたかを確認します。 44 if ($documentTypeNode instanceof DOM\DocumentType) { 45 // Dom\DocumentType ノードの baseURI プロパティの値を取得します。 46 $baseURI = $documentTypeNode->baseURI; 47 48 echo "Dom\\DocumentType->baseURI の値:\n"; 49 50 // baseURIが空文字列の場合とそうでない場合で異なるメッセージを表示します。 51 if ($baseURI === '') { 52 echo " (空文字列)\n"; 53 echo " この場合、文書がファイルパスやURLではなく、PHPコード内の文字列からロードされ、\n"; 54 echo " かつベースURIが明示的に設定されていないことを示しています。\n"; 55 } else { 56 echo " " . $baseURI . "\n"; 57 echo " この値は、文書型ノードが属する文書の基準URIを示しています。\n"; 58 } 59 echo "\n"; 60 echo "baseURIは、HTML/XML文書内で相対パスが記述されている場合に、\n"; 61 echo "それらを解決するための基準となるURIとして利用されます。\n"; 62 } else { 63 echo "エラー: Dom\\DocumentType ノードが見つかりませんでした。\n"; 64 echo "HTML文字列に '<!DOCTYPE ...>' 宣言が含まれていることを確認してください。\n"; 65 } 66} 67 68// 上記の関数を実行して、Dom\DocumentType->baseURI プロパティの動作をデモンストレーションします。 69demonstrateDocumentTypeBaseURI(); 70
Dom\DocumentType->baseURIは、PHPのDOM拡張機能が提供するDom\DocumentTypeクラスのプロパティです。このプロパティは、ドキュメントタイプノードが属する文書の基準URI(Uniform Resource Identifier)を文字列として返します。この基準URIは、HTMLやXML文書内で相対パスが使用されている場合に、それらのパスを解決するための基準点として機能します。
Dom\DocumentTypeオブジェクトは、DOM\Documentクラスのdoctypeプロパティから取得できますが、HTML文書に<!DOCTYPE ...>宣言が存在しない場合はnullとなりますので注意が必要です。
サンプルコードのように、PHPスクリプト内の文字列をDOM\Document->loadHTML()メソッドでロードした場合、明示的にベースURIが設定されない限り、baseURIプロパティは通常、空文字列を返します。これは、文書が特定のファイルパスやWeb上のURLとは関連付けられていないことを意味します。ファイルパスやURLから文書を読み込んだ場合には、そのパスやURLがbaseURIとして返されることがあります。このプロパティは常に文字列型の値を返します。
Dom\DocumentType->baseURIは、文書型ノードが属する文書の基準URIを返します。サンプルコードのようにPHPで文字列からHTMLをロードした場合、基準URIが明示的に設定されていなければ、このプロパティは空文字列('')になります。これは、文書がファイルやURLではなく、メモリ上の情報として扱われているためです。空文字列の場合、HTML内の相対パス(例えば画像やCSSへのパス)は解決されません。そのため、後続の処理でこれらの相対パスを扱う場合は、別途基準URIを考慮する必要がある点に注意してください。また、<!DOCTYPE ...>宣言がないHTMLではDom\DocumentTypeノード自体が取得できません。
PHP Dom\DocumentType::baseURI で文書の基底URIを取得する
1<?php 2 3/** 4 * Dom\DocumentType::baseURI の使用例 5 * 6 * このサンプルコードは、DOM文書の文書型ノード (<!DOCTYPE html> など) が属する文書の 7 * 基底URI (baseURI) を取得する方法を示します。 8 * 9 * キーワード「php get baseurl」は、一般的にWebアプリケーションのルートURLや 10 * 現在のスクリプトのURLを取得する文脈で使われます。 11 * それに対し、Dom\DocumentType::baseURI は、HTMLやXML文書がどこから読み込まれたか、 12 * あるいは相対パス解決の基準となるURIを指します。 13 * 14 * この例では、一時的なHTMLファイルを読み込むことで、そのファイルのURIが 15 * Dom\DocumentType::baseURI にどのように反映されるかを示します。 16 */ 17class DocumentTypeBaseURIDemo 18{ 19 /** 20 * DOM文書の文書型ノードから基底URIを取得し、表示します。 21 */ 22 public function getDocumentTypeBaseURI(): void 23 { 24 // 仮想的なHTMLファイルの内容を作成 25 $htmlContent = '<!DOCTYPE html> 26<html> 27<head> 28 <title>サンプルドキュメント</title> 29</head> 30<body> 31 <p>これはサンプルHTMLドキュメントです。</p> 32</body> 33</html>'; 34 35 // 一時的なHTMLファイルを現在のスクリプトと同じディレクトリに作成 36 $fileName = __DIR__ . '/temp_document_for_base_uri.html'; 37 if (file_put_contents($fileName, $htmlContent) === false) { 38 echo "エラー: HTMLファイルを作成できませんでした。\n"; 39 return; 40 } 41 42 // DOMDocumentオブジェクトを初期化 43 $dom = new DOMDocument(); 44 45 // 外部ファイルからHTMLを読み込む 46 // loadHTMLFile() を使用すると、読み込んだファイルのURIがDOMDocumentのbaseURIとして設定されます。 47 // Dom\DocumentType::baseURI も通常はこの値に追従します。 48 if ($dom->loadHTMLFile($fileName)) { 49 // 文書型ノード (<!DOCTYPE html>) が存在するか確認 50 if ($dom->doctype instanceof Dom\DocumentType) { 51 $documentType = $dom->doctype; 52 53 // Dom\DocumentType::baseURI プロパティの値を取得 54 // これは文書型ノードが属する文書の基底URIを示します。 55 $baseURI = $documentType->baseURI; 56 57 echo "取得された文書型ノードの基底URI: " . ($baseURI ?: "未設定") . "\n"; 58 // 参考として、DOMDocument自体の基底URIも表示 59 echo "DOMDocumentの基底URI (参考): " . ($dom->baseURI ?: "未設定") . "\n"; 60 } else { 61 echo "文書型ノード (<!DOCTYPE html>) が見つかりませんでした。\n"; 62 } 63 } else { 64 echo "エラー: HTMLファイルの読み込みに失敗しました。\n"; 65 } 66 67 // 作成した一時ファイルをクリーンアップ 68 if (file_exists($fileName)) { 69 unlink($fileName); 70 } 71 } 72} 73 74// クラスのインスタンスを作成し、メソッドを実行してデモを表示 75$demo = new DocumentTypeBaseURIDemo(); 76$demo->getDocumentTypeBaseURI();
PHP 8のDom\DocumentTypeクラスのbaseURIプロパティは、HTMLやXML文書の文書型ノード(例:<!DOCTYPE html>)が属する文書の「基底URI」を取得できるプロパティです。基底URIとは、文書の読み込み元や、相対パス解決の基準となるURIを指します。このプロパティは引数を取らず、基底URIを文字列(string)として返します。
「php get baseurl」というキーワードはWebアプリケーションのルートURL取得に用いられますが、Dom\DocumentType::baseURIはDOM文書内で特定の文書型ノードが属するファイルやリソースのURIを指します。
サンプルコードでは、仮想的なHTMLを含む一時ファイルを作成し、DOMDocumentのloadHTMLFile()で読み込みます。これにより、DOMDocumentと文書型ノードのbaseURIプロパティには、読み込んだ一時ファイルのパスが基底URIとして設定されます。コードは$dom->doctypeから文書型ノードを取得し、そのbaseURIプロパティの値が一時ファイルのパスとして表示されることを示します。この実演でDOM文書の基底URIと取得方法を理解できます。処理後、一時ファイルは削除されます。
このサンプルコードは、DOM文書の文書型ノードに紐づく基底URIを取得する方法を示しています。Dom\DocumentType::baseURIは、WebアプリケーションのルートURLではなく、HTMLやXML文書がどこから読み込まれたかを示す文書自体の基底URIであることに注意してください。特にDOMDocument::loadHTMLFile()でファイルを読み込むと、そのファイルのURIが基底URIとして設定されます。DOMDocument::loadHTML()で文字列から解析する場合は異なる動作となる可能性があります。
また、$dom->doctypeプロパティは、<!DOCTYPE html>のような文書型宣言が存在しない場合、nullを返します。そのため、$dom->doctype instanceof Dom\DocumentTypeで必ず存在チェックを行ってからアクセスするようにしてください。baseURIが設定されていない場合は空文字列が返される可能性があるため、その場合の表示や処理も考慮すると良いでしょう。一時ファイルの作成と削除を含むファイル操作は、エラーハンドリングを適切に行い、確実にクリーンアップすることが重要です。