【PHP8.x】DOMDocumentType::publicIdプロパティの使い方
publicIdプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
publicIdプロパティは、DOMDocumentTypeクラスに属し、XMLやHTMLドキュメントのDOCTYPE宣言に含まれる公開識別子(PUBLIC ID)を保持するプロパティです。
DOMDocumentTypeクラスは、ドキュメントの冒頭に記述されるDOCTYPE宣言、すなわちドキュメント型定義を表現します。この宣言は、そのドキュメントがどのようなDTD(Document Type Definition)に基づいて記述されているかを示す重要な情報です。publicIdプロパティは、DOCTYPE宣言内でPUBLICキーワードに続いて指定される、公開識別子と呼ばれる文字列の値を保持します。この公開識別子は、DTDのリソースを一意に特定するために使用され、通常は特定の標準規格や組織によって定められた形式で記述されます。
例えば、HTML4.01の厳格なDTDを参照するDOCTYPE宣言では、"-//W3C//DTD HTML 4.01//EN"のような文字列がpublicIdとして保持されます。これは、W3Cによって定義されたHTML 4.01のDTDを参照していることを示します。
もしDOCTYPE宣言に公開識別子が指定されていない場合、このプロパティは空の文字列を保持します。これは、特定の公開DTDを参照していない場合や、システム識別子(SYSTEM ID)のみが指定されている場合などに発生します。プログラマーは、このpublicIdプロパティを利用して、ドキュメントがどの公開DTDに準拠しているかをプログラム的に確認したり、ドキュメントのバリデーションや処理ロジックの分岐に役立てたりすることができます。
構文(syntax)
1<?php 2$dom = new DOMDocument(); 3$dom->loadXML('<!DOCTYPE root PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><root/>'); 4 5$documentType = $dom->doctype; 6 7$publicIdValue = $documentType->publicId;
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
DOMDocumentTypeオブジェクトが表すDOCTYPE宣言の公開識別子(Public Identifier)を文字列で返します。
サンプルコード
PHP: DOMDocumentTypeのpublicIdを取得する
1<?php 2 3/** 4 * DOMDocumentType の publicId プロパティの使用例を示します。 5 * 6 * publicId は DOMDocumentType クラスの public なプロパティであり、 7 * ドキュメントタイプ宣言 (DOCTYPE) に含まれる公開識別子 (Public Identifier) を取得します。 8 * public プロパティであるため、オブジェクトのインスタンスから直接アクセス可能です。 9 */ 10function demonstrateDomDocumentTypePublicId(): void 11{ 12 // DOMDocument オブジェクトを作成します。 13 $dom = new DOMDocument(); 14 15 // PUBLIC ID を含む DOCTYPE 宣言を持つHTML文字列をロードします。 16 // この例では、"-//W3C//DTD HTML 4.01 Transitional//EN" が Public ID です。 17 $html = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' . 18 '<html><body><h1>サンプルページ</h1></body></html>'; 19 20 // HTMLをパースします。エラーが発生する可能性があるので、@で抑制することもできますが、 21 // 適切なエラーハンドリングが推奨されます。今回は簡潔さを優先します。 22 $dom->loadHTML($html); 23 24 // ドキュメントタイプ (DOCTYPE) オブジェクトを取得します。 25 // ドキュメントに DOCTYPE 宣言がない場合、null が返されます。 26 $doctype = $dom->doctype; 27 28 // ドキュメントタイプが存在するか確認します。 29 if ($doctype instanceof DOMDocumentType) { 30 // DOMDocumentType オブジェクトの publicId プロパティにアクセスします。 31 // このプロパティは public なので、インスタンス ($doctype) から直接 -> 演算子でアクセスできます。 32 $publicId = $doctype->publicId; 33 34 echo "検出された Public ID: " . $publicId . "\n"; 35 } else { 36 echo "DOCTYPE 宣言が見つかりませんでした。\n"; 37 } 38} 39 40// 関数を実行して、publicId の値を出力します。 41demonstrateDomDocumentTypePublicId(); 42
PHPのDOM拡張機能の一部であるDOMDocumentTypeクラスのpublicIdプロパティは、HTMLやXMLドキュメントのDOCTYPE宣言(ドキュメントタイプ宣言)に含まれる公開識別子(Public Identifier)を取得するために使用されます。このプロパティは、ウェブ標準に準拠した文書がどのような公開標準を参照しているかを確認する際に役立ちます。
publicIdは「public」なプロパティであり、これはDOMDocumentTypeクラスのインスタンスが作成された後、オブジェクトから直接アクセスできることを意味します。例えば、$doctypeというDOMDocumentTypeオブジェクトがあれば、$doctype->publicIdのように->演算子を用いて直接値を取得できます。これに対し「private」なプロパティは、クラスの外部から直接アクセスすることはできません。
このプロパティは引数を取らず、戻り値として公開識別子の文字列を返します。サンプルコードでは、まずDOMDocumentクラスを用いてHTML文字列をロードし、そのHTMLから$dom->doctypeプロパティを通じてDOMDocumentTypeオブジェクトを取得しています。DOCTYPE宣言が存在する場合、$doctypeはDOMDocumentTypeのインスタンスとなり、$doctype->publicIdにアクセスすることで、DOCTYPE宣言内の公開識別子(例: "-//W3C//DTD HTML 4.01 Transitional//EN")を文字列として取得し、出力しています。もしDOCTYPE宣言が見つからない場合は$dom->doctypeがnullとなるため、publicIdプロパティへのアクセスは行われません。このように、文書の構造に関するメタ情報をプログラムで効率的に利用することが可能です。
このpublicIdプロパティはpublicなため、DOMDocumentTypeオブジェクトのインスタンスから直接アクセス可能です。これは、クラス内部からのみアクセス可能なprivateプロパティとは異なる点です。最も注意すべきは、読み込んだHTMLにDOCTYPE宣言がない場合、$dom->doctypeはnullを返します。そのため、publicIdにアクセスする前には、必ずDOMDocumentTypeオブジェクトが存在するかどうかをinstanceofで確認してください。DOMDocument::loadHTML()などの関数はパースエラーを起こす可能性があるため、実運用ではエラー抑制(@)ではなく、適切なエラーハンドリングの実装が安全なコード利用に繋がります。
PHP DOCTYPE の publicId を取得する
1<?php 2 3/** 4 * DOMDocumentType::publicId プロパティの使用例を示します。 5 * 6 * この関数は、与えられたHTMLまたはXML文字列からDOCTYPE宣言を解析し、 7 * その公開識別子 (PUBLIC ID) を表示します。 8 * 9 * @param string $htmlOrXmlString 解析対象のHTMLまたはXML文字列。 10 * @return void 11 */ 12function demonstratePublicId(string $htmlOrXmlString): void 13{ 14 // DOMDocument オブジェクトを作成し、HTML/XMLをロードします。 15 // HTML5などの新しいDOCTYPEではPUBLIC IDを持たない場合もあります。 16 $dom = new DOMDocument(); 17 18 // DOMDocument::loadHTML() は、不正なHTML構造に対して警告を出すことがあります。 19 // 初心者の方には、この警告が混乱の元になる可能性があるため、 20 // ここでは一時的に警告の出力を抑制します。 21 libxml_use_internal_errors(true); 22 $dom->loadHTML($htmlOrXmlString); 23 libxml_use_internal_errors(false); // 処理後は元の状態に戻します。 24 25 // ドキュメントの DOMDocumentType オブジェクトを取得します。 26 // このオブジェクトは、DOCTYPE宣言に関する情報(publicIdなど)を含んでいます。 27 $docType = $dom->doctype; 28 29 if ($docType instanceof DOMDocumentType) { 30 // DOMDocumentType::publicId プロパティは、DOCTYPE宣言に指定された 31 // 公開識別子(PUBLIC ID)を返します。 32 // 例えば、XHTML 1.0 Strictでは "-//W3C//DTD XHTML 1.0 Strict//EN" のような値になります。 33 // HTML5の <!DOCTYPE html> のようにPUBLIC IDを持たない場合は、空文字列を返します。 34 $publicId = $docType->publicId; 35 36 echo "DOCTYPEの公開識別子 (publicId): " . ($publicId === '' ? '[空]' : $publicId) . PHP_EOL; 37 38 // キーワード「php publicとは」について: 39 // この 'publicId' はプロパティ名の一部であり、PHPのアクセス修飾子 'public' とは直接関係ありません。 40 // しかし、この 'publicId' プロパティ自体がクラス内で『publicな』プロパティとして定義されているため、 41 // 上記のように `$docType->publicId` の形式で、クラスのインスタンスから直接アクセスできます。 42 // これは、プロパティがクラスの外部からアクセス可能であることを意味します。 43 } else { 44 echo "このドキュメントには DOCTYPE 宣言が見つかりませんでした。" . PHP_EOL; 45 } 46} 47 48// --- サンプルコードの使用例 --- 49 50// 例1: XHTML 1.0 Strict の DOCTYPE を持つHTML 51// このDOCTYPEはPUBLIC識別子を持つため、publicIdが取得されます。 52$xhtmlStrictHtml = <<<'HTML' 53<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 54<html> 55<head><title>XHTML Sample</title></head> 56<body><h1>Hello, XHTML!</h1></body> 57</html> 58HTML; 59 60echo "--- サンプル1: XHTML 1.0 Strict の DOCTYPE ---" . PHP_EOL; 61demonstratePublicId($xhtmlStrictHtml); 62echo PHP_EOL; 63 64// 例2: HTML5 の DOCTYPE を持つHTML 65// HTML5のDOCTYPEはPUBLIC識別子を持たないため、publicIdは空文字列になります。 66$html5 = <<<'HTML' 67<!DOCTYPE html> 68<html> 69<head><title>HTML5 Sample</title></head> 70<body><h1>Hello, HTML5!</h1></body> 71</html> 72HTML; 73 74echo "--- サンプル2: HTML5 の DOCTYPE ---" . PHP_EOL; 75demonstratePublicId($html5); 76echo PHP_EOL; 77 78// 例3: DOCTYPE が存在しないHTML 79// この場合、DOMDocumentType オブジェクトが取得できないため、PUBLIC IDも取得されません。 80$noDoctypeHtml = <<<'HTML' 81<html> 82<head><title>No Doctype Sample</title></head> 83<body><h1>Hello!</h1></body> 84</html> 85HTML; 86 87echo "--- サンプル3: DOCTYPE なし ---" . PHP_EOL; 88demonstratePublicId($noDoctypeHtml); 89echo PHP_EOL;
PHPのDOM拡張機能に属するDOMDocumentType::publicIdプロパティは、HTMLやXML文書の冒頭にあるDOCTYPE宣言に記述されている「公開識別子 (PUBLIC ID)」を取得するために使用されます。
このプロパティは引数を取らず、戻り値として文字列を返します。DOCTYPE宣言にPUBLIC IDが明確に指定されている場合、例えばXHTML 1.0 Strictでは"-//W3C//DTD XHTML 1.0 Strict//EN"といった具体的な識別子の文字列が返されます。一方、HTML5の<!DOCTYPE html>のようにPUBLIC IDが指定されていない現代のDOCTYPE宣言では、空の文字列が戻り値となります。
サンプルコードでは、DOMDocumentクラスを使って与えられたHTML/XML文字列を解析し、そのdoctypeプロパティからDOMDocumentTypeオブジェクトを取得しています。このオブジェクトからpublicIdプロパティにアクセスすることで、文書の公開識別子を抽出し、画面に出力する仕組みを示しています。
キーワード「php publicとは」に関してですが、このpublicIdはプロパティ名であり、PHPのアクセス修飾子publicとは直接的な意味合いが異なります。しかし、このpublicIdプロパティ自体は、DOMDocumentTypeクラスの外部から直接アクセス可能な「public」なメンバーとして定義されているため、$docType->publicIdのように利用できることを意味します。
DOMDocumentType::publicIdプロパティは、DOCTYPE宣言に指定された公開識別子(PUBLIC ID)を取得します。HTML5のように公開識別子を持たないDOCTYPEでは空文字列を返しますので、返り値が空の場合の処理を考慮してください。また、ドキュメントにDOCTYPE宣言が存在しない場合、$dom->doctypeはnullとなるため、publicIdプロパティにアクセスする前に必ずDOMDocumentTypeオブジェクトであるかを確認する必要があります。サンプルコードでHTML/XMLパース時の警告を一時的に抑制しているのは、初心者の混乱を避けるためです。実際の開発では、適切なエラーハンドリングを検討することが安全なコード利用につながります。「publicId」というプロパティ名はPHPのアクセス修飾子「public」とは直接の関係はありませんが、このプロパティ自体はクラス内でpublicとして定義されており、オブジェクトから直接アクセスできることを意味します。