ホームページ >バックエンド開発 >PHPチュートリアル >PHP ews: コンストラクター プロパティのプロモーション

PHP ews: コンストラクター プロパティのプロモーション

Susan Sarandon
Susan Sarandonオリジナル
2024-12-14 06:41:11820ブラウズ

PHP ews: Constructor Property Promotion

Constructor Property Promotion は、クラス内でのプロパティの宣言と初期化を簡素化する PHP 8 で導入された機能です。 PHP 8 より前では、クラス プロパティを明示的に宣言し、コンストラクター内で初期化する必要がありました。この機能を使用すると、コンストラクターのパラメーター リストでプロパティを直接宣言して初期化できるため、定型コードが削減されます。

従来の構文 (PHP 8 より前)

class Product {
    private string $name;
    private float $price;

    public function __construct(string $name, float $price) {
        $this->name = $name;
        $this->price = $price;
    }
}

コンストラクター プロパティのプロモーション構文 (PHP 8)

class Product {
    public function __construct(
        private string $name,
        private float $price
    ) {}
}

特典

  1. 定型コードを削減します:

    • コンストラクターの外でプロパティを宣言して手動で初期化する必要がなくなります。
  2. 読みやすさの向上:

    • 特に多くのプロパティを持つクラスで、コードがより簡潔で理解しやすくなります。
  3. 不変性をサポートします:

    • 初期化後の変更を防ぐために、プロパティを読み取り専用としてマークすることができます (PHP 8.1 で導入)。

メモ

  1. 可視性修飾子:

    • プロモートされたプロパティには、可視性修飾子 (プライベート、プロテクト、またはパブリック) が含まれている必要があります。
  2. デフォルト値:

    • プロモートされたプロパティにデフォルト値を直接設定することはできませんが、コンストラクターでデフォルトの引数値を使用できます。
    class Product {
       public function __construct(
           private string $name = 'Unnamed',
           private float $price = 0.0
       ) {}
    }
    
  3. プロモートされたプロパティと非プロモートされたプロパティの混合:

    • 同じクラス内で従来のプロパティとプロモートされたプロパティを組み合わせることができます。
    class Product {
       private string $category;
    
       public function __construct(
           private string $name,
           private float $price
       ) {
           $this->category = 'General';
       }
    }
    

使用例

コンストラクター プロパティのプロモーションは、主な目的がデータの保存であるDTO (データ転送オブジェクト)のような単純なクラスに特に役立ちます。

class CustomerDTO {
    public function __construct(
        public string $name,
        public string $email,
        public ?string $phone = null
    ) {}
}

結論

コンストラクター プロパティのプロモーションは、生産性を向上させ、コードの複雑さを軽減する PHP 8 の強力な機能です。これは、簡潔かつ明確な初期化が必要な、複数のプロパティを持つクラスに最適です。

属性の統合

PHP 8 では、属性 (アノテーションとも呼ばれます) を コンストラクター プロパティ プロモーション とシームレスに組み合わせることができ、特にメタデータをプロパティに関連付ける必要があるシナリオで、よりクリーンで表現力豊かなコードが得られます。

コンストラクタープロパティプロモーションとの統合

コンストラクター プロパティのプロモーションを使用すると、プロパティはコンストラクターで直接定義されます。属性を使用すると、プロパティを個別に宣言することなく、これらのプロパティを装飾し、コンテキスト情報を追加できます。

実践例

DTO (データ転送オブジェクト) で作業していて、プロパティをデータベース列にマップするとします

コンストラクタープロパティのプロモーションなし

class Product {
    private string $name;
    private float $price;

    public function __construct(string $name, float $price) {
        $this->name = $name;
        $this->price = $price;
    }
}

コンストラクタープロパティプロモーション付き

class Product {
    public function __construct(
        private string $name,
        private float $price
    ) {}
}

統合の利点

  1. 削減定型コード:

    • プロモートされたプロパティにより重複した宣言が排除され、属性をコンストラクターのプロパティに直接適用できます。
  2. よりクリーンで読みやすいコード:

    • 統合により、初期化、メタデータ、可視性が 1 か所に結合されます。
  3. 反射を伴う柔軟性:

    • PHP の Reflection API を使用して、プロモートされたプロパティに適用される属性にアクセスして処理できます。

リフレクションを使用した属性へのアクセス

class Product {
   public function __construct(
       private string $name = 'Unnamed',
       private float $price = 0.0
   ) {}
}

コードの説明

  1. 列属性の定義:

    • #[Attribute] デコレーターは、Column クラスが属性であることを示します。
    • 属性クラスは、プロパティをデータベース列に関連付けるために使用される単一のパラメーター名を受け入れます。
  2. コンストラクターパラメータへの属性の追加:

    • #[Column('user_id')] や #[Column('username')] などの属性がコンストラクター パラメーターの id と name に追加されます。
  3. リフレクションの使用:

    • User クラス用に ReflectionClass オブジェクトが作成され、そのプロパティとメソッドを検査できるようになります。
  4. コンストラクターへのアクセス:

    • getConstructor() は User クラスのコンストラクターを取得します。
  5. パラメータの反復処理:

    • getParameters() はコンストラクターのすべてのパラメーターを取得します。
  6. 属性の取得:

    • getAttributes(Column::class) は、パラメーターに適用される Column 型のすべての属性を取得します。
  7. 属性のインスタンス化:

    • newInstance() は Column 属性のインスタンスを作成し、その name プロパティへのアクセスを許可します。
  8. メタデータの印刷:

    • パラメータ名 (id など) とそれに関連付けられた列名 (user_id など) をコンソールに出力します。

出力:

class Product {
   private string $category;

   public function __construct(
       private string $name,
       private float $price
   ) {
       $this->category = 'General';
   }
}

一般的な使用例

  1. データベース マッピング:

    • #[Column] のような属性を使用してデータベース列を指定します。
  2. データ検証:

    • #[NotNull] や #[MaxLength(255)] などの検証をプロパティに直接適用します。
  3. シリアル化/逆シリアル化:

    • プロパティを JSON フィールドにマッピングします (例: #[JsonField('user_name')]。

結論

Constructor Property PromotionAttributes の統合により、PHP でクラスを構造化するための強力かつ簡潔な方法が提供されます。これは、ORM、検証、シリアル化などのメタデータに依存するシステムで特に便利で、コードの表現力が高まり、体系化されます。

以上がPHP ews: コンストラクター プロパティのプロモーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。