【PHP8.x】URLプロパティの使い方
URLプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
URLプロパティは、XMLドキュメントのベースURI(Uniform Resource Identifier)を保持するプロパティです。これは、PHPのDOM拡張機能において、XMLドキュメント全体を表現するDom\XMLDocumentクラスの一部として提供されています。
ベースURIとは、そのXMLドキュメントがどこから読み込まれたのか、またはドキュメント内の相対的なパスが何に基づいて解決されるべきかを示す基準となるURLやパスのことです。例えば、XMLドキュメントがファイルシステム上の特定のパスから読み込まれた場合や、インターネット上のURLから取得された場合、このURLプロパティにはその元の場所を示すURIが格納されます。
ドキュメント内に記述された画像やスタイルシート、外部エンティティなどの相対パスを持つリソースは、このベースURIを基準として完全なパスに解決されます。これにより、XMLドキュメントがどの環境で処理されても、関連するリソースへ正しくアクセスできるようになります。
ただし、DOMDocument::loadXML()メソッドのように、メモリ上の文字列からドキュメントが作成された場合など、明確な元となるURIが存在しない場合は、このプロパティは空の文字列を返すことがあります。このプロパティは文字列型であり、ドキュメントの読み込み時に自動的に設定されるため、通常は読み取り専用として扱われます。XMLドキュメントの出所や関連リソースの解決基準を知る上で重要な情報を提供するプロパティです。
構文(syntax)
1<?php 2$document = new DOMDocument(); 3$document->load('https://example.com/document.xml'); 4 5$documentUrl = $document->URL;
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP DomDocumentとurlencodeでURLを生成する
1<?php 2 3/** 4 * XMLデータから値を取得し、URLエンコードされたクエリ文字列を含むURLを生成します。 5 * 6 * この関数は、Dom\XMLDocument を使用してXMLを解析し、 7 * 特定の要素の値を取得します。その後、urlencode() を使用して 8 * その値をURLセーフな文字列に変換し、ベースURLに追加して返します。 9 * 10 * @return void 11 */ 12function generateUrlWithEncodedQuery(): void 13{ 14 // 検索クエリを含むサンプルXMLデータ 15 // "PHP & XML" のように、URLにそのまま含めると問題が発生する可能性のある文字を含んでいます。 16 $xmlString = <<<XML 17 <?xml version="1.0" encoding="UTF-8"?> 18 <search> 19 <query>PHP & XML</query> 20 <engine>Google</engine> 21 </search> 22 XML; 23 24 // DOMDocumentオブジェクトを作成します (PHP 8以降は Dom\XMLDocument) 25 $doc = new Dom\XMLDocument(); 26 27 // XML文字列を読み込みます 28 $doc->loadXML($xmlString); 29 30 // ドキュメントのベースとなるURLを設定します。 31 // これはリファレンス情報の `URL` プロパティに相当する機能を持つ `documentURI` プロパティです。 32 $doc->documentURI = 'https://example.com/search'; 33 34 // <query> タグの要素を取得します 35 $queryNode = $doc->getElementsByTagName('query')->item(0); 36 37 // 要素からテキストコンテンツを取得します 38 $queryValue = $queryNode?->textContent; 39 40 if ($queryValue) { 41 // urlencode() を使用して、クエリの値をURLで使用できる形式にエンコードします。 42 // 例: 'PHP & XML' -> 'PHP+%26+XML' 43 $encodedQuery = urlencode($queryValue); 44 45 // ベースURLとエンコードされたクエリを結合して、最終的なURLを生成します 46 $finalUrl = $doc->documentURI . '?q=' . $encodedQuery; 47 48 echo "元のクエリ: " . $queryValue . PHP_EOL; 49 echo "生成されたURL: " . $finalUrl . PHP_EOL; 50 } else { 51 echo "クエリ要素が見つかりませんでした。" . PHP_EOL; 52 } 53} 54 55// 関数を実行して結果を表示します 56generateUrlWithEncodedQuery();
このPHPコードは、XMLデータから特定の文字列を抽出し、その文字列をURLの一部として安全に利用できる形式に変換(URLエンコード)して、最終的なURLを生成する処理を示しています。
まず、new Dom\XMLDocument()でXMLデータを操作するためのオブジェクトを作成します。documentURIプロパティは、このXMLドキュメントが関連付けられている基準となるURLを設定または取得するために使用されます。このサンプルでは、生成するURLのベース部分として 'https://example.com/search' を設定しています。
次に、loadXML()メソッドでXML形式の文字列を読み込み、getElementsByTagName()メソッドで<query>タグの要素を取得します。そして、textContentプロパティを使い、要素内のテキスト「PHP & XML」を取り出します。
ここで重要なのがurlencode()関数です。取得した「PHP & XML」という文字列には、スペースや&記号など、URL中で特別な意味を持つ文字が含まれています。urlencode()関数は、引数に渡されたこれらの文字を、URLとして安全に解釈される % を使った16進数表記などに変換し、その結果を戻り値として返します。
最後に、documentURIプロパティに設定しておいたベースURLと、urlencode()によって変換された文字列を連結することで、最終的なURLを組み立て、画面に出力しています。
URLに値を埋め込む際は、urlencode()関数の利用が不可欠です。「&」やスペースなどの記号はURL内で特別な意味を持つため、エンコードせずに使用するとURLが壊れたり、意図しない動作を引き起こしたりする原因になります。このコードは、XMLから取得した値を安全にURLへ組み込むための正しい手順を示しています。また、Dom\XMLDocumentのdocumentURIプロパティは、文書の場所を示すだけでなく、URLを組み立てる際のベースURLを保持する変数としても利用できます。コード中の?->という記法は、XML要素が見つからなくてもエラーを起こさず安全に処理を続けるためのもので、PHP 8から利用できる便利な機能です。
PHP Dom\XMLDocumentのURLプロパティを取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 指定されたURLからXMLを読み込み、そのドキュメントのURLプロパティを取得して表示します。 7 * 8 * @param string $url 読み込むXMLファイルのURL。 9 * @return void 10 */ 11function displayDocumentUrl(string $url): void 12{ 13 // Dom\XMLDocumentクラスのインスタンスを生成します。 14 $doc = new Dom\XMLDocument(); 15 16 // URLからXMLドキュメントを読み込みます。 17 // 読み込みに失敗した場合に警告が表示されるのを防ぐため、@演算子を使用しています。 18 if (@$doc->load($url)) { 19 // load()メソッドでドキュメントを読み込むと、 20 // URLプロパティにそのドキュメントのソースURIが自動的に設定されます。 21 // ここでURLプロパティの値を取得します。 22 $sourceUrl = $doc->URL; 23 24 echo "読み込まれたドキュメントのURL: " . $sourceUrl . PHP_EOL; 25 } else { 26 echo "指定されたURLからドキュメントを読み込めませんでした。" . PHP_EOL; 27 } 28} 29 30// 読み込み対象のXMLファイルのURL 31$sampleUrl = 'https://www.w3.org/Style/XSL/Test/fuzone.xml'; 32 33// 関数を呼び出して、URLプロパティの値を取得・表示します。 34displayDocumentUrl($sampleUrl); 35 36?>
このPHPコードは、Dom\XMLDocumentクラスのURLプロパティを使い、読み込んだXMLドキュメントのソースURLを取得して表示するサンプルです。
Dom\XMLDocumentクラスが持つURLプロパティは、ドキュメントの元となった場所(URI)を保持するためのものです。このプロパティは読み取り専用で、load()メソッドなどで外部のXMLファイルを正常に読み込むと、そのファイルのURLが自動的に格納されます。
サンプルコード内のdisplayDocumentUrl関数を見てみましょう。この関数は、引数$urlでXMLファイルのURLを文字列として受け取ります。関数内では、まずnew Dom\XMLDocument()でXMLを扱うためのオブジェクトを作成し、$doc->load($url)で指定されたURLからXMLを読み込みます。読み込みに成功すると、$doc->URLプロパティにアクセスして読み込み元URLを取得し、その値を画面に出力します。この関数は戻り値がないvoid型のため、処理結果を返すことはなく、画面表示のみを行います。
このコードを実行すると、load()メソッドの引数で指定したURLが、URLプロパティから正しく取得され、コンソールに表示されます。
このコードのURLプロパティは、load()メソッドでXMLファイルを読み込んだ後に、そのファイルの場所(URL)を格納するためのものです。このプロパティは読み取り専用であり、開発者が直接値を設定するものではありません。load()が成功して初めて値がセットされるため、必ず読み込み処理が成功したことを確認してからアクセスする必要があります。サンプルコードではエラーを抑制する@演算子が使われていますが、実際の開発ではネットワークの問題やXMLの形式エラーなど、失敗の原因を特定するために、libxml_use_internal_errors()関数などを使ってエラーをきちんと処理することが重要です。また、loadXML()メソッドで文字列からXMLを読み込んだ場合、URLプロパティには値が設定されない点にも注意してください。