【PHP8.x】Dom\TokenList::__construct()メソッドの使い方
__constructメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
__constructメソッドは、Dom\TokenListクラスの新しいインスタンスを初期化するために内部的に実行されるメソッドです。Dom\TokenListクラスは、DOM要素のclass属性値を、スペースで区切られた個々のトークン(クラス名)の集合として表現し、これを手軽に操作するための機能を提供します。この__constructメソッドは、オブジェクトが生成される際に一度だけ呼び出される特別なコンストラクタですが、privateとして宣言されているため、開発者がスクリプト内でnew Dom\TokenList()のように直接呼び出してインスタンスを生成することはできません。Dom\TokenListのインスタンスは、Dom\ElementオブジェクトのclassListプロパティにアクセスした際に、PHPのDOM拡張機能によって自動的に生成され、返されます。つまり、このコンストラクタはPHPが内部的にDOM要素とトークンリストを関連付ける初期化処理を行うためのものであり、プログラマが直接利用することを想定していません。したがって、通常はこのメソッドの存在を意識することなく、classListプロパティを通じてadd()やremove()といった各メソッドを利用することになります。
構文(syntax)
1private __construct()
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP 8 コンストラクタプロモーションでクラスを定義する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * ユーザー情報を表すクラス 7 */ 8class User 9{ 10 /** 11 * PHP 8.0 の新機能「コンストラクタのプロパティ昇格」を利用したコンストラクタ。 12 * 13 * 引数に public, protected, private の可視性修飾子を付けるだけで、 14 * プロパティの宣言と、コンストラクタ内での代入処理 ($this->name = $name;) を 15 * 同時に行うことができます。これにより、コードがより簡潔になります。 16 * 17 * @param int $id ユーザーID(公開プロパティ) 18 * @param string $name ユーザー名(公開プロパティ) 19 * @param string $email メールアドレス(非公開プロパティ) 20 */ 21 public function __construct( 22 public int $id, 23 public string $name, 24 private string $email, 25 ) { 26 // コンストラクタプロモーションにより、この中身は空で問題ありません。 27 } 28 29 /** 30 * ユーザー情報を文字列として返します。 31 * 32 * @return string 33 */ 34 public function getInfo(): string 35 { 36 // クラス内からは private プロパティである $email にもアクセスできます。 37 return sprintf( 38 "ID: %d, Name: %s, Email: %s", 39 $this->id, 40 $this->name, 41 $this->email 42 ); 43 } 44} 45 46// User クラスのインスタンスを生成します。 47// コンストラクタに渡された値は、自動的にプロパティに設定されます。 48$user = new User(1, 'Taro Yamada', 'taro@example.com'); 49 50// public プロパティにはクラスの外から直接アクセスできます。 51echo 'User Name: ' . $user->name . PHP_EOL; 52 53// getInfo() メソッドを呼び出して、全情報を表示します。 54echo $user->getInfo() . PHP_EOL; 55 56// private プロパティにはクラスの外からアクセスしようとするとエラーになります。 57// echo $user->email; // Fatal error: Uncaught Error: Cannot access private property User::$email 58 59?>
このサンプルコードは、ユーザー情報を扱うUserクラスを定義する例です。特に、PHP 8.0から導入された「コンストラクタのプロパティ昇格」という機能を使って、コードを簡潔に記述しています。
__constructメソッドは、クラスからインスタンスが生成される際に一度だけ自動的に呼び出される特殊なメソッド(コンストラクタ)です。このコードでは、コンストラクタの引数にpublicやprivateといった可視性修飾子を直接記述しています。これにより、クラスのプロパティを宣言すると同時に、引数で受け取った値をそのプロパティへ代入する処理が自動的に行われます。
publicが付けられたidとnameは、クラスの外部から直接アクセスできるプロパティになります。一方、privateが付けられたemailは、クラスの内部からしかアクセスできず、外部から直接参照しようとするとエラーになります。
getInfoメソッドは引数を取らず、ユーザーの全情報(ID、名前、メールアドレス)を結合した文字列を戻り値として返します。クラスのメソッド内からは、privateなemailプロパティにも問題なくアクセスできます。
このサンプルコードで使われている「コンストラクタのプロパティ昇格」は、PHP 8.0以降で利用可能な機能です。古いバージョンのPHPでは動作しないため、実行環境の確認が必要です。この機能を使う際、コンストラクタの引数で指定したプロパティを、クラスの本体で重複して宣言しないように注意してください。public修飾子を付けたプロパティはクラスの外部から直接値を変更できてしまいます。意図しない変更を防ぎ、コードの安全性を高めるためには、原則としてプロパティはprivateとし、外部とのやり取りには専用のメソッドを定義することが推奨されます。また、declare(strict_types=1);が指定されているため、コンストラクタには型宣言通りの値を渡す必要があります。
PHP 8 コンストラクタプロパティプロモーションでクラスを簡潔にする
1<?php 2 3declare(strict_types=1); 4 5/** 6 * PHP 8.0 の新機能「コンストラクタプロパティのプロモーション」を示すクラスです。 7 * 8 * この機能を使うと、コンストラクタの引数で直接プロパティを宣言・初期化でき、 9 * コードをより簡潔に記述できます。 10 */ 11class UserProfile 12{ 13 // コンストラクタの引数に可視性(public, private, protected)を付けると、 14 // 同名のプロパティが自動的に定義され、値が代入されます。 15 // これにより、プロパティの宣言とコンストラクタ内での代入文を省略できます。 16 public function __construct( 17 public readonly int $id, 18 public string $name, 19 private string $email 20 ) { 21 } 22 23 /** 24 * プロフィール情報を表示します。 25 * privateなプロパティも、クラスの内部からはアクセスできます。 26 */ 27 public function display(): void 28 { 29 echo "ID: {$this->id}, Name: {$this->name}, Email: {$this->email}" . PHP_EOL; 30 } 31} 32 33// コンストラクタの引数に値を渡してインスタンスを生成します。 34$user = new UserProfile(101, 'Taro Yamada', 'taro@example.com'); 35 36// publicプロパティには外部からアクセスできます。 37echo $user->name . PHP_EOL; 38 39// public readonlyプロパティは読み取り専用です。 40echo $user->id . PHP_EOL; 41// $user->id = 202; // この行はエラーになります (Fatal error: Cannot modify readonly property) 42 43// クラス内部のメソッドを呼び出します。 44$user->display(); 45 46// privateプロパティには外部からアクセスできないため、以下のコードはエラーになります。 47// echo $user->email; // Fatal error: Cannot access private property 48 49?>
__constructは、クラスから新しいインスタンスが生成される際に一度だけ自動的に呼び出される、コンストラクタという特別なメソッドです。
サンプルコードで示されているのは、PHP 8.0から導入された「コンストラクタプロパティのプロモーション」という機能です。この機能を利用すると、コンストラクタの引数にpublicやprivateといった可視性修飾子を付けるだけで、プロパティの宣言と初期化を同時に行うことができます。具体的には、クラス内に同名のプロパティが自動で定義され、インスタンス生成時に渡された引数の値がそのプロパティへ代入されます。これにより、従来必要であったクラス直下でのプロパティ宣言と、コンストラクタ内での代入文(例: $this->name = $name;)を省略でき、コードが非常に簡潔になります。
また、readonlyキーワードを併用すると、プロパティを読み取り専用に設定できます。このプロパティは、インスタンス化の際に一度だけ値を設定でき、その後は変更することができなくなります。
コンストラクタの主な役割はインスタンスの初期化であり、特定の値を返すことではないため、__constructメソッドに戻り値はありません。引数は、生成されるインスタンスが持つ各プロパティの初期値を外部から設定するために使用されます。
このサンプルコードで使われているコンストラクタの書き方は、PHP 8.0で導入された「コンストラクタプロパティのプロモーション」という機能です。引数にpublicやprivateなどの可視性修飾子を付けることで、プロパティの宣言と初期化を同時に行え、コードが簡潔になります。注意点として、readonlyを付けたプロパティは初期化後に値を変更しようとするとエラーになります。また、privateなプロパティはクラスの外からは直接アクセスできません。この便利な構文はPHP 8.0以降のバージョンでしか利用できないため、実行環境のバージョンを確認することが重要です。