コンストラクタプロモーション(8.0)
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 42/91。
PHP 8.0ではconstructor promotionが導入されました。これは、クラスを定義する際のボイラープレートコードを大幅に削減する機能です。propertiesを個別に宣言してからconstructorで代入する代わりに、両方を1つのステップで行えます。
これまで使ってきた従来のアプローチは次のとおりです:
<?php
class Product {
private string $name;
private float $price;
public function __construct(string $name, float $price) {
$this->name = $name;
$this->price = $price;
}
public function getInfo(): string {
return $this->name . ": $" . $this->price;
}
}
コンストラクターのプロモーションでは、アクセス修飾子をコンストラクターのパラメーターに直接追加します。
<?php
class Product {
public function __construct(
private string $name,
private float $price
) {}
public function getInfo(): string {
return $this->name . ": $" . $this->price;
}
}
$product = new Product("Laptop", 999.99);
echo $product->getInfo();
出力:
Laptop: $999.99コンストラクターのパラメーターの前に private、protected、または public を追加すると、PHP は自動的にプロパティを作成し、その値を代入します。同じコンストラクター内で昇格されたパラメーターと通常のパラメーターを組み合わせることができ、必要に応じてコンストラクター本体にロジックを追加することもできます。
重要なポイント: コンストラクタプロモーションにより、冗長なプロパティの宣言と代入が不要になり、full なカプセル化の制御を維持しながら、クラスをよりすっきりさせ、読みやすくできます。
チャレンジ
簡単constructor promotion の優雅さを示す連絡先管理システムを構築しましょう。ボイラープレートコードを排除しながら、適切なカプセル化を維持する、クリーンでモダンな PHP クラスを作成します。
コードを2つのファイルに整理します。
Contact.php: constructor promotion を使用して、すべての properties を constructor のシグネチャで directly define するContactclass を Create します。contact には次のものを持たせます。- private な
$nameproperty(string) - private な
$emailproperty(string) - default value が
"Not provided"の private な$phoneproperty(string)
"[name] | [email] | [phone]"を返す public methodgetFullDetails()を Add します。また、"Contact: [name]"を返す methodgetSummary()も Add します。- private な
main.php: Contact file を Include します。name、email、phone number の3つの input を受け取ります。2つのContactinstance を Create します。- first contact では、all three values(name、email、phone)を使用します
- second contact では、name と email only を使用します(default phone value に依存します)
- first contact の full details
- first contact の summary
- second contact の full details
- second contact の summary
constructor promotion を使用すると、properties の define、visibility の設定、types の declaration、values の assignment を、すべて1つの読みやすい constructor signature で行えることに注目してください。default value を持つ optional phone parameter は、promoted parameters が regular parameters と同様に default values とシームレスに機能することを示しています。
自分で試してみよう
<?php
require_once 'Contact.php';
// 入力を読み取る
$name = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$phone = trim(fgets(STDIN));
// TODO: 3つの値すべて(name、email、phone)で最初の連絡先を作成する
// TODO: nameとemailのみで2番目の連絡先を作成する(デフォルトのphoneを使用)
// TODO: 最初の連絡先の完全な詳細を出力する
// TODO: 最初の連絡先の概要を出力する
// TODO: 2番目の連絡先の完全な詳細を出力する
// TODO: 2番目の連絡先の概要を出力する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ