【PHP8.x】DOMEntityReference::__construct()メソッドの使い方
__constructメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『__constructメソッドは、新しいDOMEntityReferenceオブジェクトを作成するメソッドです。DOMEntityReferenceクラスは、XMLやHTMLドキュメント内で使用されるエンティティ参照ノードを表します。エンティティ参照とは、「&」や「<」のように、あらかじめ定義された名前で特定の文字や記号を表現するための記述方法です。このコンストラクタは、引数としてエンティティの名前を文字列で受け取ります。例えば、「&」というエンティティ参照ノードを作成したい場合は、new DOMEntityReference('amp') のように、アンパサンドやセミコロンを除いた名前である「amp」を引数に指定して呼び出します。このメソッドによって生成されたノードは、特定のドキュメントには属していない状態です。そのため、ドキュメントツリーに組み込むためには、DOMDocument::importNode() を使ってノードをインポートするか、通常はより推奨される DOMDocument::createEntityReference() メソッドを使用して、ドキュメントに属するインスタンスとして生成します。』
構文(syntax)
1$entity_reference = new DOMEntityReference('name');
引数(parameters)
string $name
- string $name: エンティティ参照の名称を指定する文字列
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP 8 コンストラクタプロパティ昇格でクラスを生成する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * DOMEntityReference::__construct の動作を模倣し、 7 * PHP 8 の「コンストラクタプロパティ昇格」を説明するためのクラスです。 8 */ 9class CustomEntityReference 10{ 11 // PHP 8 の新機能「コンストラクタプロパティ昇格」を利用しています。 12 // 引数に `public` を付けるだけで、プロパティの宣言と初期化が同時に完了します。 13 public function __construct(public string $name) 14 { 15 // このコンストラクタの中身は空でも、プロパティは正しく設定されます。 16 } 17} 18 19// 'lt' という名前でインスタンスを生成します。 20$entity = new CustomEntityReference('lt'); 21 22// 昇格されたプロパティ `name` にアクセスして値を出力します。 23// 出力結果: lt 24echo $entity->name . PHP_EOL; 25
DOMEntityReference::__constructは、新しいDOMEntityReferenceオブジェクトを生成するためのコンストラクタです。引数$nameには、作成したいエンティティ参照の名前を文字列で指定します。例えば、< を表す 'lt' などが該当します。コンストラクタであるため、このメソッド自体には戻り値はありません。
サンプルコードは、この動作を模倣したCustomEntityReferenceクラスを定義し、PHP 8の新機能である「コンストラクタプロパティ昇格」を説明しています。この機能を使うと、コンストラクタの引数定義でアクセス修飾子(publicなど)を付けるだけで、プロパティの宣言と引数の値による初期化を同時に行うことができます。
コード内のpublic function __construct(public string $name)という一行は、publicな$nameプロパティを宣言し、引数で受け取った値で初期化する処理を兼ねています。これにより、従来必要だったクラス本体でのプロパティ宣言(public string $name;)や、コンストラクタ内での代入処理($this->name = $name;)を省略でき、コードが非常に簡潔になります。実際にnew CustomEntityReference('lt')でインスタンスを生成した後、$entity->nameにアクセスすると、指定した値である'lt'が正しく出力されることが確認できます。
このサンプルコードで使われている「コンストラクタプロパティ昇格」は、PHP 8.0から導入された新機能のため、それ以前のバージョンでは利用できません。この構文を使うには、コンストラクタの引数に必ずpublic、protected、privateのいずれかの可視性修飾子を指定する必要があります。これを付け忘れると、プロパティの自動的な宣言と代入は行われません。サンプルではコンストラクタの本体が空ですが、プロパティ初期化以外の処理も通常通り記述できます。この機能を活用すると、プロパティの宣言と初期化の記述を一行にまとめられるため、コードが非常に簡潔になります。
PHP: parent::__construct で親クラスを呼び出す
1<?php 2 3/** 4 * 親クラスである DOMEntityReference を継承したカスタムクラス 5 * 6 * 子クラスのコンストラクタから親クラスのコンストラクタを呼び出す例を示します。 7 */ 8class CopyrightEntityReference extends DOMEntityReference 9{ 10 /** 11 * このクラス独自のプロパティ (PHP 8.1+ の readonly プロパティ) 12 * @var string 13 */ 14 public readonly string $description; 15 16 /** 17 * コンストラクタ 18 * 19 * @param string $name 親クラスに渡すエンティティ名 20 * @param string $description このクラスで利用する説明文 21 */ 22 public function __construct(string $name, string $description) 23 { 24 // 最初に `parent::__construct()` を呼び出し、親クラス (DOMEntityReference) の 25 // コンストラクタを確実に実行します。これにより、オブジェクトが 26 // DOMEntityReference として正しく初期化されます。 27 parent::__construct($name); 28 29 // 親クラスの初期化が終わった後、子クラス独自のプロパティを設定します。 30 $this->description = $description; 31 } 32} 33 34// DOMDocumentのインスタンスを作成 35$dom = new DOMDocument('1.0', 'UTF-8'); 36$dom->formatOutput = true; // 出力を整形する 37 38// ルート要素を作成してドキュメントに追加 39$root = $dom->createElement('document'); 40$dom->appendChild($root); 41 42// カスタムクラスのインスタンスを作成します。 43// このとき、CopyrightEntityReferenceのコンストラクタが呼ばれ、 44// その内部で親であるDOMEntityReferenceのコンストラクタも実行されます。 45$copyright = new CopyrightEntityReference('copy', '著作権記号'); 46 47// 作成したノードにテキストを追加し、ルート要素に追加します。 48$textNode = $dom->createTextNode('Copyright '); 49$root->appendChild($textNode); 50$root->appendChild($copyright); // © が追加される 51 52// 生成されたXMLを出力して、エンティティ参照が正しく作成されたことを確認します。 53echo $dom->saveXML(); 54 55// 子クラスで追加したプロパティにアクセスできることを確認します。 56echo 'エンティティの説明: ' . $copyright->description . PHP_EOL; 57 58?>
DOMEntityReference::__construct()は、新しいエンティティ参照ノードのインスタンスを作成するためのコンストラクタです。コンストラクタは、newキーワードでクラスのインスタンスを生成する際に自動的に呼び出される特別なメソッドです。
このメソッドは、引数 $name にエンティティ参照の名前(例えば 'copy' や 'amp' など)を文字列で受け取ります。この引数に基づいて、指定された名前を持つDOMエンティティ参照ノードが生成されます。コンストラクタ自体には、明示的な戻り値はありません。
サンプルコードでは、DOMEntityReferenceクラスを継承した独自のCopyrightEntityReferenceクラスを定義しています。子クラスのコンストラクタ内で記述されているparent::__construct($name)は、親クラスであるDOMEntityReferenceのコンストラクタを呼び出すための構文です。これにより、まず親クラスの機能としてエンティティ参照ノードが正しく初期化され、その後に子クラス独自のプロパティ設定などの処理を追加できます。このように、継承関係にあるクラスでは、親クラスのコンストラクタを呼び出して基本的な初期化を確実に行うことが重要です。
クラスを継承して独自のコンストラクタを定義する際の注意点です。子クラスでコンストラクタを定義すると、親クラスのコンストラクタは自動的に実行されなくなります。そのため、サンプルコードのようにparent::__construct()を使い、明示的に親クラスのコンストラクタを呼び出す必要があります。これを呼び忘れると、オブジェクトが正しく初期化されず、予期せぬエラーの原因となります。子クラス独自の処理を行う前に、コンストラクタの先頭で親の初期化処理を呼び出すのが一般的で安全な実装です。また、このコードで使われているreadonlyプロパティはPHP 8.1以降の機能で、一度値を設定すると変更できない点にも注意してください。