Menu
Coddy logo textTech

コンストラクタプロモーション(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

コンストラクターのパラメーターの前に privateprotected、または public を追加すると、PHP は自動的にプロパティを作成し、その値を代入します。同じコンストラクター内で昇格されたパラメーターと通常のパラメーターを組み合わせることができ、必要に応じてコンストラクター本体にロジックを追加することもできます。

重要なポイント: コンストラクタプロモーションにより、冗長なプロパティの宣言と代入が不要になり、full なカプセル化の制御を維持しながら、クラスをよりすっきりさせ、読みやすくできます。

challenge icon

チャレンジ

簡単

constructor promotion の優雅さを示す連絡先管理システムを構築しましょう。ボイラープレートコードを排除しながら、適切なカプセル化を維持する、クリーンでモダンな PHP クラスを作成します。

コードを2つのファイルに整理します。

  • Contact.php: constructor promotion を使用して、すべての properties を constructor のシグネチャで directly define する Contact class を Create します。contact には次のものを持たせます。
    • private な $name property(string)
    • private な $email property(string)
    • default value が "Not provided" の private な $phone property(string)
    constructor promotion syntax を使用します。個別の property declaration は不要です!"[name] | [email] | [phone]" を返す public method getFullDetails() を Add します。また、"Contact: [name]" を返す method getSummary() も Add します。
  • main.php: Contact file を Include します。name、email、phone number の3つの input を受け取ります。2つの Contact instance を Create します。
    • first contact では、all three values(name、email、phone)を使用します
    • second contact では、name と email only を使用します(default phone value に依存します)
    4行を Print します。
    • 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番目の連絡先の概要を出力する

?>
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: PHPオンラインコンパイラ