【PHP8.x】__constructメソッドの使い方
__constructメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
__constructメソッドは、Deprecated属性のインスタンスを初期化するために実行されるメソッドです。Deprecated属性は、PHP 8.0から導入された機能で、関数、メソッド、クラスなどが非推奨、つまり将来的に廃止される可能性があることを開発者に示すために使用されます。このコンストラクタは、#[Deprecated]のように属性構文がコード内で使用された際に内部的に呼び出されます。引数として、非推奨である理由や代替手段を示すメッセージ、そしてそれが非推奨となったバージョン情報を任意で受け取ります。ここで渡された情報は、Deprecated属性のインスタンス内部に保持されます。そして、この属性が付与された非推奨の要素がプログラム中で呼び出されると、PHPはE_DEPRECATEDレベルのエラーを発生させます。そのエラーメッセージには、コンストラクタで設定されたメッセージが含まれるため、開発者はどのコードを修正すべきかを正確に知ることができます。このように、このメソッドはPHPにおける後方互換性の維持と、コードベースの健全な移行を支援する上で重要な役割を担っています。
構文(syntax)
1<?php 2 3#[Deprecated(message: "この関数は非推奨です。代わりに new_function() を使用してください。", since: "8.0")] 4function old_function(): void 5{ 6} 7
引数(parameters)
string $message = '', string $since = ''
- string $message: 例外としてスローされるエラーメッセージを指定します。デフォルトは空文字列です。
- string $since: この例外が導入されたPHPのバージョンを指定します。デフォルトは空文字列です。
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP 8: __construct で非推奨情報を初期化する
1<?php 2 3/** 4 * プログラミング言語の特定の要素(例:関数やクラス)が 5 * 今後使われなくなる予定であることを示すための、独自のサンプルクラスです。 6 * PHPにおける __construct メソッドの基本的な使い方を理解することを目的とします。 7 * 8 * PHP 8 のコンストラクタプロパティプロモーションを使用しています。 9 */ 10class MyDeprecatedFeature 11{ 12 /** 13 * MyDeprecatedFeature クラスの新しいインスタンスを生成します。 14 * 15 * これはクラスが作成される際に自動的に呼び出される特別なメソッド(コンストラクタ)です。 16 * 提供されたリファレンス情報にある Deprecated クラスの __construct メソッドの 17 * 引数定義(`string $message = '', string $since = ''`)を参考にしています。 18 * 19 * PHP 8 の新機能である「コンストラクタプロパティプロモーション」により、 20 * 引数をプロパティとして宣言し、同時に初期化することができます。 21 * 22 * @param string $message 非推奨である理由を示すメッセージ。デフォルトは空文字列。 23 * @param string $since 非推奨になった、または非推奨になる予定のバージョン。デフォルトは空文字列。 24 */ 25 public function __construct( 26 private string $message = '', 27 private string $since = '' 28 ) { 29 // 引数はすでに private プロパティとして宣言され、初期化されているため、 30 // ここに `$this->message = $message;` といった記述は不要です。 31 } 32 33 /** 34 * この非推奨機能に関する情報を整形して返します。 35 * 36 * @return string 非推奨メッセージとバージョン情報。 37 */ 38 public function getInfo(): string 39 { 40 if ($this->message === '' && $this->since === '') { 41 return "この機能に関する非推奨情報は特に指定されていません。"; 42 } elseif ($this->message === '') { 43 return "この機能はバージョン {$this->since} で非推奨になります。"; 44 } elseif ($this->since === '') { 45 return "非推奨情報: {$this->message}"; 46 } else { 47 return "非推奨情報: {$this->message} (バージョン {$this->since} より)"; 48 } 49 } 50} 51 52// --- 以下、MyDeprecatedFeature クラスの使用例です --- 53 54// 例1: メッセージとバージョンを両方指定してインスタンスを作成します。 55// このとき、__construct メソッドが自動的に呼び出され、引数がプロパティに設定されます。 56$feature1 = new MyDeprecatedFeature( 57 'この関数は将来のバージョンで削除される予定です。', 58 'PHP 9.0' 59); 60echo "特徴1: " . $feature1->getInfo() . PHP_EOL; 61 62// 例2: メッセージのみを指定してインスタンスを作成します。 63// $since 引数はデフォルト値(空文字列)が適用されます。 64$feature2 = new MyDeprecatedFeature('データベース接続方法はより安全な方法に変更されます。'); 65echo "特徴2: " . $feature2->getInfo() . PHP_EOL; 66 67// 例3: 引数を何も指定せずにインスタンスを作成します。 68// 両方の引数にデフォルト値(空文字列)が適用されます。 69$feature3 = new MyDeprecatedFeature(); 70echo "特徴3: " . $feature3->getInfo() . PHP_EOL; 71
このサンプルコードは、PHPでクラスのインスタンスが作成される際に自動的に呼び出される特別なメソッド「__construct(コンストラクタ)」の基本的な使い方を示しています。
MyDeprecatedFeatureクラスの__constructメソッドは、非推奨となる機能に関する情報(メッセージとバージョン)を受け取ります。引数$messageは非推奨の理由を説明する文字列、$sinceは非推奨になった、または非推奨になる予定のバージョンを示す文字列です。これらはどちらも省略可能で、省略された場合はデフォルトの空文字列が設定されます。このメソッドは、クラスの初期化を行うため、特定の値を返すことはありません。
PHP 8の新機能である「コンストラクタプロパティプロモーション」を使用しており、引数をprivate string $messageのように宣言することで、同時にクラスのプロパティとして定義され、受け取った値で初期化されます。これにより、コンストラクタ内で改めて$this->message = $message;と書く必要がなくなります。
サンプルコードの実行部分では、MyDeprecatedFeatureクラスのインスタンスを生成する際に、__constructメソッドが自動で呼び出され、渡された引数(またはデフォルト値)がクラス内に保存される様子を確認できます。getInfo()メソッドを通じて、保存された情報がどのように利用されるかを示しています。
__constructメソッドは、クラスのインスタンスが作成される際に自動的に実行される特別なメソッドで、オブジェクトの初期化に用いられます。このメソッドは戻り値を持ちません。サンプルコードでは、PHP 8の「コンストラクタプロパティプロモーション」を利用しており、引数を宣言と同時にクラスプロパティとして定義・初期化できるため、簡潔な記述が可能です。ただし、この機能はPHP 8以降でのみ利用できます。また、引数にデフォルト値が設定されている場合、その引数を省略してインスタンスを作成することも可能です。このサンプルは、PHP内部のDeprecatedクラスの引数定義を参考に、__constructメソッドの基本的な動作とPHP 8の新しい書き方を理解するためのものです。
PHP 8 コンストラクタプロパティプロモーションを理解する
1<?php 2 3/** 4 * PHP 8 で導入されたコンストラクタプロパティプロモーションの例です。 5 * これにより、コンストラクタの引数を直接クラスのプロパティとして宣言し、初期化できます。 6 */ 7class Product 8{ 9 /** 10 * コンストラクタプロパティプロモーションを使用して、 11 * $name (商品名) と $price (価格) をプロパティとして宣言し、初期化します。 12 * public, protected, private のいずれかの可視性修飾子が必要です。 13 * 14 * @param string $name 商品の名前 15 * @param float $price 商品の価格 16 */ 17 public function __construct( 18 public string $name, 19 public float $price 20 ) { 21 // プロパティプロモーションを使用する場合、コンストラクタの本体が空になることがよくあります。 22 // ここに初期化ロジックを追加することも可能です。 23 } 24 25 /** 26 * 商品の詳細情報を取得します。 27 * 28 * @return string 商品名と価格を含む文字列 29 */ 30 public function getDetails(): string 31 { 32 return "商品名: {$this->name}, 価格: " . number_format($this->price, 2) . "円"; 33 } 34} 35 36// Product クラスのインスタンスを作成します。 37$product1 = new Product('PHP入門書', 2980.50); 38$product2 = new Product('キーボード', 8500.00); 39 40// プロパティに直接アクセスできます。 41echo $product1->getDetails() . PHP_EOL; // 出力: 商品名: PHP入門書, 価格: 2,980.50円 42echo $product2->getDetails() . PHP_EOL; // 出力: 商品名: キーボード, 価格: 8,500.00円 43 44// プロパティは public なので直接読み書き可能です。 45$product1->price = 2500.00; 46echo $product1->getDetails() . PHP_EOL; // 出力: 商品名: PHP入門書, 価格: 2,500.00円 47 48?>
PHPにおける__constructメソッドは、クラスから新しいインスタンス(オブジェクト)が作られる際に自動的に実行される特別なメソッドです。主に、オブジェクトが必要とする初期設定を行うために使用されます。このメソッドは、値を返しません。
PHP 8から導入された「コンストラクタプロパティプロモーション」という機能により、__constructメソッドの引数として、直接クラスのプロパティを宣言し、同時に初期化することが可能になりました。これにより、従来のPHPバージョンで必要だったプロパティの宣言と、コンストラクタ内での引数からプロパティへの代入処理を省略でき、コードをより簡潔に記述できます。
サンプルコードのProductクラスでは、public string $nameやpublic float $priceのように、引数に可視性修飾子(public、protected、privateのいずれか)と型宣言を付加しています。これにより、$nameと$priceが自動的にクラスのプロパティとして宣言され、インスタンス作成時に引数として渡された値で初期化されます。
例えば、new Product('PHP入門書', 2980.50)と記述すると、'PHP入門書'が$nameプロパティに、2980.50が$priceプロパティに直接格納されます。これらのプロパティはpublicで宣言されているため、$product1->nameのようにインスタンスから直接アクセスしたり、値を変更したりできます。getDetailsメソッドは、これらのプロパティの値を組み合わせて整形された文字列を返しています。
この機能はPHP 8以降で利用可能です。コンストラクタの引数にpublic、protected、privateのいずれかの可視性修飾子を付けることで、自動的にクラスのプロパティとして宣言され、初期化されます。これにより、別途プロパティを宣言したり、コンストラクタ内で代入したりする手間が省け、コードが簡潔になります。コンストラクタの本体は通常空になりますが、追加の初期化ロジックが必要な場合は記述できます。宣言されたプロパティへのアクセスは、指定した可視性修飾子に従いますので、サンプルコードのようにpublicで宣言したプロパティは外部から直接読み書きが可能になる点にご注意ください。