【PHP8.x】Dom\Entity::baseURIプロパティの使い方
baseURIプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
baseURIプロパティは、PHP 8のDom\Entityクラスに属し、そのエンティティノードの基準URI(Base URI)を保持するプロパティです。Dom\Entityクラスは、HTMLやXMLのようなマークアップ言語で作成された文書を、プログラムで操作できるように表現するDOM(Document Object Model)において、特殊な文字や外部リソースへの参照を定義する「エンティティ」を表します。
このbaseURIプロパティは、Dom\Entityがどこからロードされたのか、またはエンティティ内で指定されている相対パスのリソースを解決する際の起点となるURI情報を提供します。たとえば、ウェブページ上の画像が相対パス(例: images/logo.png)で指定されている場合、その画像ファイルの正確な場所は、そのウェブページの基準URI(例: https://example.com/)と相対パスを組み合わせることで解決されます。Dom\EntityにおけるbaseURIも同様に、エンティティ自身の定義場所や、エンティティが参照する外部ファイルなどの相対パスを、絶対パスとして正しく解釈するために重要な役割を果たします。
システムエンジニアがHTMLやXML文書を解析し、文書内のリソースを正確に処理する必要がある場合に、このbaseURIプロパティは文書構造やリソースの解決において不可欠な情報源となります。
構文(syntax)
1<?php 2$domEntityInstance = new Dom\Entity(); // Dom\Entity クラスのインスタンスを仮に生成 3$baseUri = $domEntityInstance->baseURI;
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
Dom\Entity クラスの baseURI プロパティは、そのエンティティの基盤となる URI を文字列で返します。
サンプルコード
PHP Dom\Entity::baseURI を理解する
1<?php 2 3// Dom\Entity::baseURI プロパティは、DTD(Document Type Definition)内で定義されたエンティティのベースURIを提供します。 4// これは、エンティティが定義されているドキュメントや外部ファイルのURIを示します。 5// 一般的なウェブページのベースURL(HTMLの<base>タグなど)とは異なる概念であることに注意してください。 6// ここでは、Dom\Entity クラス (PHP 8で導入された名前空間付きのクラス) の baseURI プロパティの取得方法を示します。 7// PHP 8では、既存の DOMEntity クラスが Dom\Entity のエイリアスとして扱われます。 8 9// 1. DOMDocument オブジェクトを作成します。 10$dom = new DOMDocument(); 11 12// 2. DTD (Document Type Definition) を含むXML文字列をロードします。 13// ここでは、内部サブセットで二つのエンティティを定義します。 14// 一つは内部エンティティ、もう一つはSYSTEM識別子を持つ外部エンティティです。 15$xmlString = <<<XML 16<?xml version="1.0" encoding="UTF-8"?> 17<!DOCTYPE root [ 18 <!ENTITY internalEntity "これは内部エンティティです。"> 19 <!ENTITY externalRefEntity SYSTEM "http://www.example.com/external_resource.txt"> 20]> 21<root> 22 <element>&internalEntity;</element> 23</root> 24XML; 25 26// XML文字列をDOMDocumentにロードします。 27// 注意: loadXML() で文字列からロードした場合、ドキュメント自体のURIは不明となるため、 28// baseURIプロパティは通常、空文字列を返します。 29// ファイルからロード (例: $dom->load('example.xml')) した場合は、ファイルのパスがベースURIになります。 30$dom->loadXML($xmlString); 31 32// 3. ドキュメントの DocumentType (DTD情報) を取得します。 33$doctype = $dom->doctype; 34 35// DTDが利用可能で、エンティティが定義されているか確認します。 36if ($doctype instanceof DOMDocumentType && $doctype->entities->length > 0) { 37 echo "Dom\\Entity::baseURI の使用例:\n\n"; 38 39 // 最初のエンティティ(internalEntity)を取得します。 40 // DOMDocumentType->entities は DOMNamedNodeMap を返し、そのアイテムは DOMEntity オブジェクトです。 41 $internalEntity = $doctype->entities->item(0); 42 43 if ($internalEntity instanceof DOMEntity) { 44 echo "エンティティ名: " . $internalEntity->nodeName . "\n"; 45 // Dom\Entity::baseURI プロパティの値を出力します。 46 echo " baseURI: '" . $internalEntity->baseURI . "'\n"; 47 echo " (補足: loadXML()で文字列からロードしたため、ドキュメントのURIが不明で空文字列になります。)\n"; 48 } 49 50 echo "\n"; 51 52 // 二番目のエンティティ(externalRefEntity)を取得します。 53 $externalRefEntity = $doctype->entities->item(1); 54 55 if ($externalRefEntity instanceof DOMEntity) { 56 echo "エンティティ名: " . $externalRefEntity->nodeName . "\n"; 57 // Dom\Entity::baseURI プロパティの値を出力します。 58 echo " baseURI: '" . $externalRefEntity->baseURI . "'\n"; 59 echo " (補足: SYSTEM識別子が指定されていても、エンティティ定義自体のベースURIはドキュメントのものに依存します。)\n"; 60 } 61 62} else { 63 echo "DTDまたはエンティティが見つかりませんでした。\n"; 64} 65 66?>
Dom\Entity::baseURIプロパティは、XMLのDTD(Document Type Definition)内で定義されたエンティティのベースURIを取得します。PHP 8で導入されたDom\Entityクラス(従来のDOMEntityのエイリアス)に属し、引数はなく、string型のURIを返します。このベースURIは、エンティティが定義されているドキュメントや外部ファイルのURIを示し、HTMLの<base>タグのような一般的なウェブページのベースURLとは異なる概念です。
サンプルコードでは、DTD内にエンティティを定義したXML文字列をDOMDocument::loadXML()で読み込んでいます。loadXML()で文字列からロードした場合、ドキュメントのURIが不明なため、通常baseURIは空文字列となります。ファイルからロードした場合は、そのファイルのパスがベースURIとなります。ドキュメントのdoctypeプロパティからDOMDocumentTypeオブジェクト、さらにそのentitiesコレクションからDom\Entityオブジェクトを取得し、baseURIプロパティにアクセスすることで、各エンティティのベースURIを確認できます。SYSTEM識別子で外部リソースを指定するエンティティの場合も、そのエンティティ定義自体のベースURIはドキュメントのベースURIに依存します。これにより、プログラムからエンティティの定義元のURIを正確に把握することができます。
このbaseURIは、DTD内で定義されたエンティティが参照する基準となるURIであり、一般的なウェブページのベースURLとは異なる概念であることに注意が必要です。DOMDocument::loadXML()でXML文字列をロードした場合、ドキュメントのURIが不明なためbaseURIは通常空文字列となります。ファイルからロードするDOMDocument::load()を使った場合は、ファイルのパスがベースURIとして設定されます。外部エンティティの参照先URIが直接baseURIとなるわけではなく、エンティティを定義しているドキュメントのURIに依存します。コード利用時は、$dom->doctypeが存在するか、エンティティが含まれているか確認することで、エラーを防ぎ安全に処理できます。
PHP Dom\Entity::baseURI でエンティティのベースURIを取得する
1<?php 2 3/** 4 * Dom\Entity::$baseURI の使用例をデモンストレーションする関数。 5 * 6 * この関数は、XMLドキュメント内のエンティティのベースURIを取得する方法を示します。 7 * Dom\Entity::$baseURI は、XMLのDTD (Document Type Definition) で定義されたエンティティが 8 * 参照する外部リソースのURIを返します。 9 * 10 * 注: このプロパティは、一般的なウェブアプリケーションで現在のページのベースURLを取得する 11 * 目的とは異なりますので、ご注意ください。 12 */ 13function demonstrateDomEntityBaseURI(): void 14{ 15 // 内部DTDでSYSTEMエンティティを定義したXMLドキュメントを作成します。 16 // 'myEntity'という名前のエンティティは、外部リソース 17 // ("http://example.com/some/resource.xml") を参照しています。 18 // Dom\Entity::$baseURI プロパティは、このSYSTEM識別子で指定された 19 // URIそのもの("http://example.com/some/resource.xml")を返します。 20 $xmlString = <<<XML 21<!DOCTYPE doc [ 22 <!ENTITY myEntity SYSTEM "http://example.com/some/resource.xml"> 23]> 24<doc> 25 <item>&myEntity;</item> 26</doc> 27XML; 28 29 // DOMDocumentオブジェクトを初期化 30 $dom = new DOMDocument(); 31 32 // 外部エンティティの解決を許可します。 33 // これをtrueに設定しないと、SYSTEMエンティティのURIが正しく解決されない場合があります。 34 $dom->resolveExternals = true; 35 36 // XML文字列をロード 37 $dom->loadXML($xmlString); 38 39 echo "--- Dom\\Entity::\$baseURI のデモンストレーション ---\n\n"; 40 echo "Dom\\Entity::\$baseURI プロパティは、DOMツリー内のXMLエンティティが\n"; 41 echo "定義されているベースURIを返します。これは、HTMLドキュメントの相対パス解決や、\n"; 42 echo "外部リソースの基準となるURIを示しますが、\n"; 43 echo "一般的なウェブアプリケーションで現在のページのベースURLを取得する目的とは異なります。\n\n"; 44 45 // ドキュメントタイプ定義 (DTD) を取得 46 $doctype = $dom->doctype; 47 48 // DTDが存在し、かつエンティティが定義されているかを確認 49 if ($doctype && $doctype->entities) { 50 echo "DTDからエンティティコレクションを検索しています...\n"; 51 // ドキュメント内のエンティティコレクションをループ 52 // ここで取得される $entityNode は Dom\Entity のインスタンスです。 53 foreach ($doctype->entities as $entityName => $entityNode) { 54 if ($entityNode instanceof Dom\Entity) { 55 echo "エンティティ名: " . $entityName . "\n"; 56 echo "エンティティのベースURI: " . $entityNode->baseURI . "\n"; 57 } else { 58 // 通常、このブロックは実行されません。 59 echo "警告: エンティティノード '{$entityName}' が Dom\\Entity のインスタンスではありません。\n"; 60 } 61 } 62 } else { 63 echo "このXMLドキュメントにはDTDまたはエンティティが定義されていません。\n"; 64 } 65 66 echo "\n--- デモンストレーション終了 ---\n"; 67} 68 69// 関数を実行して、Dom\Entity::$baseURI の動作を確認します。 70demonstrateDomEntityBaseURI(); 71
Dom\Entity::$baseURIは、PHPのDOM拡張機能におけるDom\Entityクラスのプロパティです。このプロパティは、XMLドキュメントのDTD(Document Type Definition)内で定義されたエンティティが参照する外部リソースのベースURIを文字列として返します。引数は必要ありません。
サンプルコードでは、内部DTDで外部リソースを参照するSYSTEMエンティティ「myEntity」を定義したXMLドキュメントを作成しています。DOMDocumentクラスを用いてこのXMLをロードした後、$dom->doctype->entitiesからDom\Entityのインスタンスを取得します。そして、$entityNode->baseURIにアクセスすることで、そのエンティティが参照する「http://example.com/some/resource.xml」のようなURIを文字列として取得できることを示しています。
このプロパティは、XMLドキュメントにおけるエンティティ解決の基準となるURIを提供するものであり、ウェブアプリケーションで現在のページのベースURL(例えば$_SERVER['HTTP_HOST']などから構築されるもの)を取得する目的とは異なりますので、ご留意ください。初心者の方が「php get baseurl」というキーワードでこのプロパティにたどり着いた場合、その役割の専門性を理解し、誤用しないよう注意が必要です。
このサンプルコードは、XMLのDTDで定義されたエンティティのベースURIを取得するDom\Entity::$baseURIプロパティの利用例です。最も重要な注意点は、このプロパティが一般的なウェブアプリケーションで「現在のページのベースURL」を取得する目的とは全く異なる点です。これは、XMLドキュメント内のエンティティが参照する外部リソースのURIを特定するために使用されます。コードを正しく動作させるためには、DOMDocument::resolveExternalsをtrueに設定し、外部エンティティの解決を許可する必要があります。この機能は、XMLのDTDやエンティティに関する専門的な知識が必要な、特定の高度な用途向けですので、通常のウェブ開発でURL取得には使用しないようご注意ください。