首頁 > 後端開發 > php教程 > PHP ews:建構函數屬性提升

PHP ews:建構函數屬性提升

Susan Sarandon
發布: 2024-12-14 06:41:11
原創
813 人瀏覽過

PHP ews: 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 中,屬性(也稱為註解)可以與構造函數屬性提升無縫結合,從而產生更乾淨、更具表現力的程式碼,尤其是在元資料需要與屬性關聯的場景中。

與建築商房產促銷整合

透過建構函式屬性提升,屬性直接在建構函式中定義。您可以使用 Attributes 來裝飾這些屬性並添加上下文訊息,而無需單獨聲明屬性。

實際範例

假設您正在處理 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. 更乾淨、更容易閱讀的程式碼:

    • 整合將初始化、元資料和可見性合併在一處。
  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. 使用反射:

    • ReflectionClass 物件是為 User 類別建立的,允許我們檢查它的屬性和方法。
  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')].

結論

建構子屬性提升屬性的整合提供了一種在PHP中建構類別的強大而簡潔的方法。這在依賴元資料(例如 ORM、驗證或序列化)的系統中特別有用,使程式碼更具表現力和組織性。

以上是PHP ews:建構函數屬性提升的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板