【PHP8.x】Dom\DocumentType::publicIdプロパティの使い方
publicIdプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
publicIdプロパティは、Dom\DocumentTypeクラスに属し、ドキュメントタイプ宣言(DOCTYPE宣言)における公開識別子(Public Identifier)を保持するプロパティです。
Dom\DocumentTypeクラスは、PHPのDOM拡張機能の一部として提供され、HTMLやXMLドキュメントの冒頭に記述されるDOCTYPE宣言をオブジェクトとして表現します。このDOCTYPE宣言は、WebブラウザやXMLパーサに対して、そのドキュメントがどのバージョンのHTMLやXMLの仕様に準拠しているかを示す重要な情報を提供します。
publicIdプロパティは、このDOCTYPE宣言のうち、PUBLICキーワードに続いて記述される「公開識別子」の文字列値を提供します。公開識別子は、通常、ドキュメントが参照するDTD(Document Type Definition:文書型定義)などの外部リソースを一意に特定するために用いられます。例えば、HTML 4.01 StrictのDOCTYPE宣言に見られる「-//W3C//DTD HTML 4.01 Strict//EN」といった文字列がこれに該当します。
システムエンジニアは、このpublicIdプロパティを使用することで、プログラム的にドキュメントの公開識別子を取得し、それが特定の標準に準拠しているかを確認したり、ドキュメントの種類に応じて処理を分岐させたりすることが可能です。もしDOCTYPE宣言に公開識別子が指定されていない場合、このプロパティは空の文字列を返します。このプロパティは、ドキュメントの構造や準拠する標準に関する情報を取得する上で非常に有用なツールです。
構文(syntax)
1<?php 2// Dom\DocumentType オブジェクトの取得例 3$dom = new DOMDocument(); 4$dom->loadXML('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html></html>'); 5$documentType = $dom->doctype; 6 7// publicId プロパティにアクセスする構文 8$publicId = $documentType->publicId; 9?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
Dom\DocumentType クラスの publicId プロパティは、このドキュメントタイプの公開識別子を示す文字列を返します。
サンプルコード
PHPのpublicIdとアクセス修飾子を理解する
1<?php 2 3/** 4 * Dom\DocumentType の publicId プロパティの使用と、 5 * PHPにおける public および private アクセス修飾子の違いを示すクラス。 6 * システムエンジニアを目指す初心者が、プロパティの可視性を理解するのに役立ちます。 7 */ 8class DocumentTypeAnalyzer 9{ 10 /** 11 * 元の Dom\DocumentType オブジェクトを保持するための private プロパティ。 12 * クラスの内部からのみアクセス可能です。 13 * @var Dom\DocumentType 14 */ 15 private Dom\DocumentType $documentType; 16 17 /** 18 * Dom\DocumentType::publicId の値を格納するための public プロパティ。 19 * クラスの外部からも直接アクセス可能です。 20 * @var string 21 */ 22 public string $publicIdValue; 23 24 /** 25 * クラス内部でのみ使用される private プロパティの例。 26 * 外部からの直接アクセスはできません。 27 * @var string 28 */ 29 private string $internalNote = "この情報はクラス内部でのみ使用されます(private)。"; 30 31 /** 32 * コンストラクタ。Dom\DocumentType オブジェクトを受け取り、 33 * その publicId を自身の publicIdValue プロパティに格納します。 34 * 35 * @param Dom\DocumentType $docType 解析対象の Dom\DocumentType オブジェクト 36 */ 37 public function __construct(Dom\DocumentType $docType) 38 { 39 $this->documentType = $docType; 40 // Dom\DocumentType::publicId は public プロパティなので、 41 // インスタンスから直接アクセスして値を取得できます。 42 $this->publicIdValue = $this->documentType->publicId; 43 } 44 45 /** 46 * 格納されている publicId の値を取得する public メソッド。 47 * public プロパティは直接アクセスできますが、メソッドを介して提供することもあります。 48 * 49 * @return string public ID 50 */ 51 public function getPublicId(): string 52 { 53 return $this->publicIdValue; 54 } 55 56 /** 57 * private プロパティ internalNote の値を取得する public メソッド。 58 * private プロパティは外部から直接アクセスできないため、 59 * このように public メソッド(ゲッター)を介して値を提供します。 60 * 61 * @return string 内部ノート 62 */ 63 public function getInternalNote(): string 64 { 65 // private プロパティはクラスの内部からは自由にアクセス可能です。 66 return $this->internalNote; 67 } 68} 69 70/** 71 * Dom\DocumentType::publicId の使用例と、 72 * public/private アクセス修飾子の動作を示すメイン関数。 73 */ 74function demonstrateDocumentTypePublicIdAndAccessModifiers(): void 75{ 76 // HTML ドキュメントの例。DOCTYPE宣言が含まれています。 77 $html = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' . 78 '<html><head><title>PHP DOM Example</title></head><body><h1>Hello, PHP!</h1></body></html>'; 79 80 // Dom\HTMLDocument を使ってHTMLを読み込みます。 81 $dom = new Dom\HTMLDocument(); 82 $dom->loadHTML($html); 83 84 // ドキュメントツリーから Dom\DocumentType ノードを探します。 85 // DOCTYPE宣言は通常、ドキュメントの最初のノードの一つです。 86 $documentType = null; 87 foreach ($dom->childNodes as $node) { 88 if ($node instanceof Dom\DocumentType) { 89 $documentType = $node; 90 break; 91 } 92 } 93 94 if ($documentType) { 95 // Dom\DocumentType::publicId は string を返す public プロパティです。 96 echo "--- Dom\\DocumentType::publicId の直接アクセス ---" . PHP_EOL; 97 echo "DOCTYPE public ID: " . $documentType->publicId . PHP_EOL; 98 echo PHP_EOL; 99 100 // 作成した DocumentTypeAnalyzer クラスを使って情報を解析します。 101 $analyzer = new DocumentTypeAnalyzer($documentType); 102 103 echo "--- public プロパティへのアクセス例 ---" . PHP_EOL; 104 // DocumentTypeAnalyzer クラスの public プロパティは外部から直接アクセス可能です。 105 echo "Analyzer の publicIdValue (public): " . $analyzer->publicIdValue . PHP_EOL; 106 // public メソッドを介してアクセスすることもできます。 107 echo "Analyzer の getPublicId() (public メソッド): " . $analyzer->getPublicId() . PHP_EOL; 108 echo PHP_EOL; 109 110 echo "--- private プロパティへのアクセス例 ---" . PHP_EOL; 111 // DocumentTypeAnalyzer クラスの private プロパティは外部から直接アクセスできません。 112 // 次の行を有効にするとエラーが発生します (Uncaught Error: Cannot access private property DocumentTypeAnalyzer::$internalNote)。 113 // echo "Analyzer の internalNote (private, 直接アクセス): " . $analyzer->internalNote . PHP_EOL; 114 echo "private プロパティはクラスの外部から直接アクセスできません。" . PHP_EOL; 115 // private プロパティには、通常、public メソッドを介してアクセスします。 116 echo "Analyzer の getInternalNote() (private プロパティへのアクセス用 public メソッド): " . $analyzer->getInternalNote() . PHP_EOL; 117 118 } else { 119 echo "エラー: このHTMLドキュメントに DOCTYPE 宣言が見つかりませんでした。" . PHP_EOL; 120 } 121} 122 123// サンプルコードの実行を開始します。 124demonstrateDocumentTypePublicIdAndAccessModifiers(); 125 126?>
PHP 8のDom\DocumentType::publicIdプロパティは、HTMLやXMLドキュメントのDOCTYPE宣言に含まれる「公開識別子(Public Identifier)」を文字列として取得します。このプロパティに引数は不要で、DOCTYPE宣言に公開識別子が存在すればその値を、なければ空文字列を返します。
このサンプルコードは、Dom\DocumentType::publicIdプロパティの具体的な使用例を示すとともに、PHPにおけるpublicとprivateというアクセス修飾子の重要な違いをシステムエンジニアを目指す初心者が理解できるように設計されています。
public修飾子が付けられたプロパティやメソッドは、クラスの外部からも自由に直接アクセスできる「公開された」メンバーです。例えば、Dom\DocumentType::publicId自体や、DocumentTypeAnalyzerクラスのpublicIdValueプロパティ、getPublicId()メソッドがこれに該当し、どこからでも呼び出すことが可能です。
対照的に、private修飾子が付けられたプロパティは、そのクラスの「内部からのみ」アクセスが許可される「非公開」のメンバーです。サンプルコードのDocumentTypeAnalyzerクラスにあるinternalNoteプロパティがその例で、クラスの外部から直接アクセスしようとするとエラーが発生します。もし外部からprivateな情報を安全に取得したい場合は、getInternalNote()のようなpublicなメソッドを介して間接的にアクセスするのが一般的な設計パターンです。これにより、クラスの内部データを保護し、プログラムの整合性を保つことができます。
Dom\DocumentType::publicId プロパティは、HTMLのDOCTYPE宣言からPUBLIC IDを文字列として取得します。もしDOCTYPEにPUBLIC IDが指定されていない場合は、空文字列が返される点に留意してください。PHPの public は、プロパティやメソッドがクラスの外部から自由にアクセスできることを示します。対照的に private は、それらがクラスの内部からのみ利用可能であり、外部からの直接アクセスを禁止します。初心者が特に注意すべき点は、private プロパティをクラスの外部から直接参照しようとするとエラーになることです。private な情報に外部からアクセスさせたい場合は、public なメソッド(ゲッター)を提供することで、データの整合性を保ちつつ安全に公開できます。この public と private の使い分けは、コードの安全性と保守性を高めるための重要な概念ですので、しっかりと理解して活用してください。
PHP Dom\DocumentTypeのpublicIdを取得する
1<?php 2 3/** 4 * DOMDocumentからDocumentTypeのpublicIdを取得するサンプル関数 5 * 6 * この関数は、指定されたHTML文字列からDOMDocumentを作成し、 7 * その文書のDOCTYPE宣言に含まれるPUBLIC識別子(publicId)を取得して表示します。 8 * 9 * PUBLIC識別子とは、特定のDTD(Document Type Definition)を一意に識別するための 10 * 文字列で、HTMLやXML文書のDOCTYPE宣言の一部として使用されます。 11 * 例えば、`<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...>` の 12 * `"-//W3C//DTD XHTML 1.0 Transitional//EN"` の部分を指します。 13 * 14 * @param string $htmlString 処理するHTMLまたはXML文字列 15 * @return void 16 */ 17function getDocumentPublicId(string $htmlString): void 18{ 19 // 新しいDOMDocumentオブジェクトを作成します。 20 // このオブジェクトはHTMLやXML文書を解析し、DOMツリーとして扱えるようにします。 21 $dom = new DOMDocument(); 22 23 // 厳密なエラーチェックを無効にし、HTMLを読み込みます。 24 // HTMLの読み込み中に発生する可能性のある警告を抑制するため、`@` を付加しています。 25 @$dom->loadHTML($htmlString); 26 27 // ドキュメントからDocumentTypeオブジェクトを取得します。 28 // HTML5の `<!DOCTYPE html>` のようにPUBLIC識別子を持たないDOCTYPEの場合、 29 // またはDOCTYPE宣言がない場合、このプロパティは `null` になります。 30 // PHP 8では `Dom\DocumentType` クラスとして扱われます。 31 $doctype = $dom->doctype; 32 33 if ($doctype instanceof Dom\DocumentType) { 34 // DocumentTypeオブジェクトが存在する場合、その `publicId` プロパティにアクセスし、 35 // PUBLIC識別子の文字列を取得します。 36 $publicId = $doctype->publicId; 37 38 // 取得したPUBLIC識別子を表示します。 39 // publicIdが空文字列の場合(PUBLIC識別子がない場合)は「なし」と表示します。 40 echo "DOCTYPEのPUBLIC識別子 (publicId): " . ($publicId !== '' ? $publicId : 'なし') . PHP_EOL; 41 } else { 42 // DOCTYPE宣言がない、またはPUBLIC識別子を持たない場合にメッセージを表示します。 43 echo "この文書にはDOCTYPEまたはPUBLIC識別子が見つかりませんでした。" . PHP_EOL; 44 } 45 echo "-------------------------------------" . PHP_EOL; 46} 47 48// 例1: XHTML 1.0 Transitional の DOCTYPE宣言を含むHTML文字列 49// このDOCTYPEにはPUBLIC識別子が含まれています。 50$xhtmlHtml = <<<HTML 51<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 52<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> 53<head> 54 <title>XHTML Sample</title> 55</head> 56<body> 57 <h1>Hello, XHTML!</h1> 58</body> 59</html> 60HTML; 61 62// 例2: HTML5 の DOCTYPE宣言を含むHTML文字列 63// HTML5のDOCTYPEはPUBLIC識別子を含みません。 64$html5 = <<<HTML 65<!DOCTYPE html> 66<html> 67<head> 68 <title>HTML5 Sample</title> 69</head> 70<body> 71 <h1>Hello, HTML5!</h1> 72</body> 73</html> 74HTML; 75 76// 各HTML文字列に対して関数を実行し、結果を表示します。 77echo "--- XHTML 1.0 Transitional の例 ---" . PHP_EOL; 78getDocumentPublicId($xhtmlHtml); 79 80echo "--- HTML5 の例 ---" . PHP_EOL; 81getDocumentPublicId($html5);
PHP 8におけるDom\DocumentType::publicIdプロパティは、HTMLやXML文書のDOCTYPE宣言からPUBLIC識別子を取得するために利用されます。PUBLIC識別子とは、文書が使用しているDTD(Document Type Definition)を一意に識別する文字列のことで、例えば<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...>というDOCTYPE宣言では、"-//W3C//DTD XHTML 1.0 Transitional//EN"の部分がこれに当たります。
サンプルコードでは、まずDOMDocumentオブジェクトを作成し、loadHTMLメソッドを使ってHTML文字列を解析します。DOMDocumentは、HTMLやXML文書をプログラムで操作しやすいツリー構造(DOMツリー)に変換する役割を担います。@を付けることで、HTMLの読み込み中に発生する可能性のある警告を抑制しています。
次に、$dom->doctypeプロパティからDom\DocumentTypeオブジェクトを取得します。このオブジェクトは文書のDOCTYPE宣言を表し、もし宣言が存在しない場合はnullとなります。Dom\DocumentTypeオブジェクトが存在する場合、そのpublicIdプロパティにアクセスすることでPUBLIC識別子の文字列が得られます。このプロパティは引数を取らず、戻り値はstring型です。もしDOCTYPE宣言にPUBLIC識別子が含まれていない場合(例えばHTML5の<!DOCTYPE html>の場合など)、publicIdは空文字列を返します。この機能は、文書の種類を判別したり、特定のDTDに合わせた処理を行う際に役立ちます。
publicIdプロパティは、DOCTYPE宣言の種類によっては空文字列になる場合や、DOCTYPE自体が存在しない場合はnullになることがあります。そのため、アクセスする前には必ずinstanceof Dom\DocumentTypeで型を確認し、publicIdが空文字列の場合の処理も適切に実装してください。
また、DOMDocument::loadHTML()メソッドは、不正なHTMLを読み込む際に警告を発する可能性があります。サンプルコードでは@演算子で警告を抑制していますが、実際のシステム開発では適切なエラーハンドリングを実装し、アプリケーションの安定性を確保することが重要です。大きなHTMLファイルを扱う際には、DOMDocumentがメモリを多く消費する可能性がある点も留意してください。