Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【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::resolveExternalstrueに設定し、外部エンティティの解決を許可する必要があります。この機能は、XMLのDTDやエンティティに関する専門的な知識が必要な、特定の高度な用途向けですので、通常のウェブ開発でURL取得には使用しないようご注意ください。

関連コンテンツ

関連IT用語

関連プログラミング言語