【PHP8.x】Dom\Node::ownerDocumentプロパティの使い方
ownerDocumentプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
ownerDocumentプロパティは、ノードが属するドキュメントオブジェクトを保持するプロパティです。Dom\Nodeクラスのプロパティとして定義されており、このプロパティを通じて、ノードがどのDOMDocumentインスタンスに属しているかを知ることができます。
DOM(Document Object Model)は、XMLやHTMLドキュメントをプログラムから操作するためのインターフェースです。DOMDocumentは、そのDOMのルートとなるドキュメント全体を表すオブジェクトです。DOMツリー内の各ノードは、いずれかのDOMDocumentに属しています。
ownerDocumentプロパティは、ノードが作成されたドキュメント、またはインポートされたドキュメントを指します。ノードがDOMDocumentオブジェクトによって直接作成された場合、ownerDocumentプロパティはそのDOMDocumentオブジェクトを指します。もしノードが別のドキュメントからインポートされた場合、ownerDocumentプロパティはインポート先のDOMDocumentオブジェクトを指します。
このプロパティは読み取り専用であり、直接値を変更することはできません。ノードがどのドキュメントに属しているかを確認するために使用されます。異なるドキュメント間でノードを移動させる場合など、DOM操作を行う際に重要な役割を果たします。例えば、あるドキュメントのノードを別のドキュメントに追加する際には、インポート処理などが必要になる場合がありますが、その際にownerDocumentプロパティを参照することで、ノードが属するドキュメントを確認し、適切な処理を行うことができます。ノードがどのドキュメントに属しているかを把握することで、DOM構造を正しく操作し、意図しないエラーを防ぐことができます。
構文(syntax)
1Dom\Node::$ownerDocument;
引数(parameters)
引数なし
引数はありません
戻り値(return)
Dom\Document|null
このプロパティは、ノードが属する Dom\Document オブジェクトを返します。ドキュメントに属さないノードの場合は null を返します。
サンプルコード
ownerDocumentでドキュメント全体を保存する
1<?php 2 3/** 4 * Dom\Node::ownerDocument プロパティと Dom\Document::saveHTML メソッドの使用例を示します。 5 * HTMLドキュメントから特定のノードを取得し、そのノードが属するドキュメント全体をHTML文字列として出力します。 6 */ 7function demonstrateOwnerDocumentAndSaveHTML(): void 8{ 9 // 1. 新しい Dom\Document オブジェクトを作成し、HTMLコンテンツをロードします。 10 // Dom\Document は PHP 8 で導入された新しい DOM API のクラスです。 11 $document = new Dom\Document(); 12 $htmlContent = <<<'HTML' 13<!DOCTYPE html> 14<html> 15<head> 16 <title>Sample Document</title> 17</head> 18<body> 19 <h1>OwnerDocument Example</h1> 20 <div id="main-content"> 21 <p>この段落はメインコンテンツエリア内にあります。</p> 22 <p>ノードの関係性を示すための別の段落。</p> 23 </div> 24</body> 25</html> 26HTML; 27 28 // HTML文字列をDOMツリーにロードします。 29 // エラーハンドリングは省略していますが、実運用では適切に行うべきです。 30 @$document->loadHTML($htmlContent); 31 32 // 2. ドキュメント内の特定のノード(IDが 'main-content' の div 要素)を取得します。 33 // getElementById は Dom\Document のメソッドです。 34 $mainContentNode = $document->getElementById('main-content'); 35 36 if ($mainContentNode instanceof Dom\Element) { 37 // 3. 取得したノードの ownerDocument プロパティにアクセスします。 38 // ownerDocument はそのノードが属する Dom\Document オブジェクトを返します。 39 $ownerDocument = $mainContentNode->ownerDocument; 40 41 // ownerDocument は Dom\Document または null を返しますが、 42 // 既にドキュメントに属するノードの場合、通常は Dom\Document を返します。 43 if ($ownerDocument instanceof Dom\Document) { 44 echo "--- ノードの ownerDocument から取得したHTMLコンテンツ ---\n"; 45 // 4. 取得した Dom\Document オブジェクトに対して saveHTML() メソッドを呼び出し、 46 // ドキュメント全体のHTMLを文字列として取得し、出力します。 47 echo $ownerDocument->saveHTML() . "\n"; 48 49 // 注: 取得した ownerDocument は、通常、元の $document オブジェクトと同一です。 50 echo "\n元の Dom\\Document オブジェクトと ownerDocument は同一ですか? "; 51 echo ($document === $ownerDocument ? "はい" : "いいえ") . "\n"; 52 53 } else { 54 echo "エラー: ownerDocument が見つかりませんでした。\n"; 55 } 56 } else { 57 echo "エラー: ID 'main-content' を持つ要素が見つかりませんでした。\n"; 58 } 59} 60 61// 関数を実行します。 62demonstrateOwnerDocumentAndSaveHTML();
このサンプルコードは、PHP 8で導入された新しいDOM APIを使用し、HTMLドキュメント内の特定の要素(ノード)から、その要素が属するドキュメント全体を取得し、HTML文字列として出力する方法を示しています。
Dom\Node::ownerDocumentは、Dom\Nodeクラスに属するプロパティです。このプロパティは、引数なしで、特定のノードがどのHTMLドキュメントの一部であるかを示すDom\Documentオブジェクトを返します。ノードがまだドキュメントに属していない場合にはnullを返します。このプロパティを利用することで、ある要素から親のドキュメント全体にアクセスできます。
一方、Dom\Document::saveHTMLメソッドは、Dom\Documentクラスのメソッドです。このメソッドは、引数なしで呼び出すことで、対象となるDom\Documentオブジェクトが表現するHTMLドキュメント全体をHTML形式の文字列として返します。
サンプルコードでは、まずHTMLコンテンツをDom\Documentに読み込み、IDで指定した特定の要素を取得します。その要素のownerDocumentプロパティを通じて、要素が属するドキュメントオブジェクトを取得し、最後にそのドキュメントオブジェクトのsaveHTML()メソッドを呼び出すことで、ドキュメント全体のHTMLソースコードがコンソールに出力されます。これにより、特定のノードからその親ドキュメント全体にアクセスし、ドキュメントの内容を文字列として取得する一連の処理を理解できます。
Dom\Node::ownerDocumentプロパティは、そのノードが属するDom\Documentオブジェクトを返しますが、ノードがまだドキュメントに追加されていない場合などはnullを返す可能性があります。そのため、利用前には必ず型チェックを行いましょう。また、Dom\Document::saveHTML()メソッドは、特定のノードではなくドキュメント全体のHTMLを文字列として取得する点にご注意ください。サンプルコードのloadHTML()はエラーハンドリングを省略していますが、実際の開発では@演算子ではなく、エラーを適切に処理する仕組みを導入することが重要です。getElementById()などで要素を取得する場合も、該当する要素が見つからない可能性があるので、常にnullでないか確認してから操作するようにしてください。
Dom\Node の ownerDocument を取得する
1<?php 2 3/** 4 * Dom\Node::ownerDocument プロパティの使用例を示します。 5 * ownerDocument は、ノードが属する Dom\Document オブジェクトを返します。 6 * これにより、特定のノードがどのドキュメントに「所有されているか」を確認できます。 7 */ 8function demonstrateOwnerDocumentProperty(): void 9{ 10 // 1. 新しいDOMドキュメントを作成します。 11 // このドキュメントが、後で作成するノードの「所有者」となります。 12 $document = new Dom\Document('1.0', 'UTF-8'); 13 14 // 2. ドキュメントから新しい要素ノードを作成します。 15 // createElement() メソッドで作成されたノードは、その時点で $document に属します。 16 $element = $document->createElement('exampleTag'); 17 18 echo "--- 要素作成直後 ---" . PHP_EOL; 19 20 // 3. 要素の ownerDocument プロパティにアクセスし、所有者ドキュメントを確認します。 21 // $element は $document から作成されたため、$element->ownerDocument は $document オブジェクトを返します。 22 if ($element->ownerDocument instanceof Dom\Document) { 23 echo "要素の ownerDocument は Dom\\Document オブジェクトです。" . PHP_EOL; 24 echo "これは元のドキュメントと同じですか? " . ($element->ownerDocument === $document ? "はい" : "いいえ") . PHP_EOL; 25 } else { 26 // Dom\Document::createElement で作成されたノードの場合、ownerDocument が null になることは通常ありません。 27 echo "要素はどのドキュメントにも所有されていません (ownerDocument は null です)。" . PHP_EOL; 28 } 29 30 // 4. 作成した要素をドキュメントのルートに追加します。 31 // ownerDocument の値は、ノードが作成された時点で決まるため、 32 // ドキュメントツリーに追加しても変化しません。 33 $document->appendChild($element); 34 35 echo PHP_EOL . "--- 要素をドキュメントに追加後 ---" . PHP_EOL; 36 37 // 5. 再び ownerDocument を確認します。 38 // 結果は作成直後と同じく、元のドキュメントが所有者として返されます。 39 if ($element->ownerDocument instanceof Dom\Document) { 40 echo "要素の ownerDocument は Dom\\Document オブジェクトです。" . PHP_EOL; 41 echo "これは元のドキュメントと同じですか? " . ($element->ownerDocument === $document ? "はい" : "いいえ") . PHP_EOL; 42 } 43} 44 45// 関数を実行して動作を確認します。 46demonstrateOwnerDocumentProperty();
PHPのDom\Node::ownerDocumentプロパティは、DOMツリー内の特定のノードがどのDom\Documentオブジェクトに属しているか、つまり「どのドキュメントによって所有されているか」を確認するために使用されます。このプロパティは引数をとりません。戻り値は、ノードを所有するDom\Documentオブジェクト、またはノードがまだどのドキュメントにも関連付けられていない場合にnullとなりますが、通常、Dom\Documentから作成されたノードは常にそのドキュメントを所有者として返します。
サンプルコードでは、まず新しいDom\Documentオブジェクトを作成し、これが後に作成するノードの所有者となります。次に、このDom\DocumentオブジェクトのcreateElementメソッドを使って新しい要素ノードを作成しています。この要素ノードは、作成された時点で元のDom\Documentに所有されているため、$element->ownerDocumentにアクセスすると、元のDom\Documentオブジェクトが返されることが確認できます。ノードをドキュメントツリーに追加する(appendChild)前と後でownerDocumentプロパティを確認していますが、このプロパティの値はノードが作成された時点で決定されるため、ドキュメントツリーへの追加によって変化することはありません。これにより、どのDOMノードがどのDom\Documentオブジェクトに紐付いているかを簡単に判別できます。
Dom\Node::ownerDocument プロパティは、ノードがどの Dom\Document オブジェクトによって「作成されたか」を示す所有者ドキュメントを返します。この値はノードが生成された時点で決まるため、サンプルコードのようにその後ドキュメントツリーに追加されたかどうかで変化することはありません。
もしノードが Dom\Document を介さずに直接生成された場合、ownerDocument は null を返します。そのため、利用する際は戻り値が Dom\Document オブジェクトであるか、または null であるかを適切に確認する null チェックを行うと、予期せぬエラーを防ぎ安全です。
このプロパティはノードの直接の親ノードを示す parentNode とは異なり、ノードが属する「最上位のドキュメント」を示す点に注意してください。