【PHP8.x】DOMXPath::__construct()メソッドの使い方
__constructメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『__constructメソッドは、新しいDOMXPathオブジェクトを生成し、初期化を実行するメソッドです』
このメソッドは、クラスのインスタンスが new キーワードによって作成される際に自動的に呼び出される、コンストラクタと呼ばれる特別なメソッドです。その主な役割は、XPathクエリを実行する対象となるXMLまたはHTMLドキュメントを関連付けることです。第一引数には、操作対象となるドキュメントを表すDOMDocumentオブジェクトを必ず指定する必要があります。これにより、どのドキュメントに対してXPath式を用いてノードの検索を行うかを定義します。このコンストラクタによって生成されたDOMXPathオブジェクトは、後続のquery()やevaluate()メソッドを呼び出すための基盤となり、ドキュメント内の特定の要素や属性値へ効率的にアクセスすることを可能にします。PHP 8.0以降では、オプションの第二引数としてDOMNodeオブジェクトを渡すこともできます。これを指定した場合、XPathクエリのコンテキスト、すなわち検索の開始地点がドキュメント全体ではなく、指定したノードに限定されます。
構文(syntax)
1public __construct(DOMDocument $document, bool $registerNodeNS = true)
引数(parameters)
DOMDocument $document, bool $registerNodeNS = true
- DOMDocument $document: XPathクエリを実行する対象となるDOMDocumentオブジェクト
- bool $registerNodeNS = true: DOMDocument::registerNodeNS()を自動的に呼び出すかどうかを指定するブール値
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP DOMXPathクラスのコンストラクタでXMLを検索する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * DOMXPathクラスのコンストラクタを使用して、XMLドキュメントから特定の要素を検索するサンプルクラスです。 7 */ 8class XmlTitleFinder 9{ 10 /** 11 * XMLドキュメントからすべての書籍タイトルを検索して表示します。 12 * 13 * このメソッド内でDOMXPathクラスのインスタンスを生成しており、 14 * その際にコンストラクタ (__construct) が呼び出されます。 15 */ 16 public function findTitles(): void 17 { 18 // 1. 操作対象となるXMLデータを文字列として用意します。 19 $xmlString = <<<XML 20 <?xml version="1.0" encoding="UTF-8"?> 21 <books> 22 <book> 23 <title>PHP for Beginners</title> 24 <author>John Doe</author> 25 </book> 26 <book> 27 <title>Advanced PHP</title> 28 <author>Jane Smith</author> 29 </book> 30 </books> 31 XML; 32 33 // 2. DOMDocumentクラスのインスタンスを作成し、XMLを読み込みます。 34 // このオブジェクトが、DOMXPathコンストラクタの第1引数になります。 35 $document = new DOMDocument(); 36 $document->loadXML($xmlString); 37 38 // 3. DOMXPathクラスのコンストラクタを呼び出し、インスタンスを生成します。 39 // これにより、指定したXMLドキュメントに対してXPathクエリを実行する準備が整います。 40 // new DOMXPath(DOMDocument $document, bool $registerNodeNS = true) 41 $xpath = new DOMXPath($document); 42 43 // 4. XPathクエリを実行して、すべての<title>要素を取得します。 44 $query = '//book/title'; 45 $entries = $xpath->query($query); 46 47 // 5. 取得した結果をループで処理し、各要素のテキスト内容を出力します。 48 echo "Found Titles:" . PHP_EOL; 49 if ($entries) { 50 foreach ($entries as $entry) { 51 echo "- " . $entry->nodeValue . PHP_EOL; 52 } 53 } 54 } 55} 56 57// クラスのインスタンスを生成し、メソッドを実行します。 58$finder = new XmlTitleFinder(); 59$finder->findTitles(); 60 61?>
DOMXPathクラスのコンストラクタ__constructは、new DOMXPath()のようにして、新しいDOMXPathオブジェクトを作成する際に自動的に呼び出される特別なメソッドです。このコンストラクタの主な役割は、XPathという問い合わせ言語を使ってXMLドキュメント内の要素を検索・操作するための準備を整えることです。
第一引数の$documentには、検索対象となるXMLデータが読み込まれたDOMDocumentオブジェクトを渡します。サンプルコードでは、XML文字列を読み込んだ$document変数がこれに該当します。この引数によって、どのXMLドキュメントに対して処理を行うのかを指定します。
第二引数の$registerNodeNSは省略可能な引数で、デフォルト値はtrueです。trueに設定すると、XMLドキュメント内で定義されている名前空間を自動的に登録し、クエリで利用できるようにします。通常はデフォルトのままで問題ありません。
コンストラクタはインスタンスを生成することが目的のため、特定の値を返すわけではなく、戻り値はありません。生成されたDOMXPathオブジェクトは、サンプルコードの$xpath変数のように変数に代入され、後続のquery()メソッドなどを呼び出して実際にXMLデータを検索するために使用されます。
new DOMXPath()と記述すると、クラスのインスタンスを生成するためのコンストラクタが呼び出されます。このコンストラクタには、必ずDOMDocumentクラスのオブジェクトを第1引数として渡す必要があります。XML文字列やファイルパスを直接渡すことはできないため、サンプルコードのように事前にDOMDocumentオブジェクトを用意し、loadXML()などでXMLを読み込ませておくことが必須です。
loadXML()は不正な形式のXMLデータを読み込むと失敗する可能性があるため、実際にはエラー処理を加えることで、より安全なプログラムになります。また、$xpath->query()メソッドも実行に失敗するとfalseを返すことがあるため、その戻り値を確認する習慣をつけると良いでしょう。第2引数はXMLの名前空間を扱う際に重要となり、複雑なXMLでは設定が必要になる場合があります。
PHP DOMXPath コンストラクタでXMLを検索する
1<?php 2 3// サンプル用のXML文字列を定義します。 4$xmlString = <<<XML 5<?xml version="1.0" encoding="UTF-8"?> 6<books> 7 <book> 8 <title>PHP入門</title> 9 <author>山田 太郎</author> 10 </book> 11 <book> 12 <title>実践PHP</title> 13 <author>鈴木 花子</author> 14 </book> 15</books> 16XML; 17 18// 1. DOMDocumentオブジェクトを作成し、XMLを読み込みます。 19// このオブジェクトがXPathで検索する対象となります。 20$dom = new DOMDocument(); 21$dom->loadXML($xmlString); 22 23// 2. DOMXPathクラスのコンストラクタを使用して、新しいインスタンスを生成します。 24// 第1引数に検索対象のDOMDocumentオブジェクトを渡します。 25// ここで DOMXPath::__construct($dom) が内部的に呼び出されます。 26$xpath = new DOMXPath($dom); 27 28// 3. 作成したDOMXPathオブジェクトを使い、XPathクエリでtitle要素をすべて検索します。 29$query = '/books/book/title'; 30$entries = $xpath->query($query); 31 32// 4. 検索結果を出力します。 33echo "見つかった書籍のタイトル:" . PHP_EOL; 34foreach ($entries as $entry) { 35 // nodeValueプロパティで要素のテキスト内容を取得します。 36 echo "- " . $entry->nodeValue . PHP_EOL; 37} 38 39?>
DOMXPath::__constructは、XMLドキュメントに対してXPathクエリを実行するためのDOMXPathオブジェクトを新しく作成する際に呼び出される、特別な初期化メソッド(コンストラクタ)です。new DOMXPath()のように記述することで、このメソッドが実行されます。
このコンストラクタには、必須の引数が1つあります。第1引数の$documentには、検索対象となるXML文書を読み込んだDOMDocumentオブジェクトを渡します。これにより、どのXMLドキュメントに対して検索を行うかをDOMXPathオブジェクトに設定します。サンプルコードでは、$dom変数がこの引数に該当します。第2引数$registerNodeNSは省略可能で、XMLの名前空間を自動で登録するかどうかを指定します。
コンストラクタ自体に定められた戻り値はありませんが、その役割はDOMXPathクラスの新しいインスタンス(オブジェクト)を生成して返すことです。サンプルコードでは、$xpath = new DOMXPath($dom);という記述で新しいオブジェクトが生成され、変数$xpathに代入されています。この$xpathオブジェクトを通じてquery()などのメソッドを呼び出すことで、実際にXMLドキュメント内の要素を検索できます。
DOMXPathクラスのインスタンスを生成する際は、コンストラクタの第一引数に、検索対象となるXML文書を読み込んだDOMDocumentオブジェクトを必ず指定する必要があります。サンプルコードのnew DOMXPath($dom)が、このコンストラクタ呼び出しに該当します。事前にDOMDocumentオブジェクトへloadXML()などでXMLを正しく読み込めていないと、XPathでの検索は意図通りに機能しません。第二引数$registerNodeNSは省略可能で、デフォルトはtrueです。これはXMLに名前空間(xmlns属性など)が含まれている場合に、名前空間のプレフィックスを自動で登録する機能です。これにより、名前空間を持つXML文書でもXPathクエリを記述しやすくなります。