PHP 8: 透過建構子進行屬性提升 Constructor property promotion

在大多數的專案中你可能經常會在 class 當中宣告屬性,並在建構子(Constructor) 中賦予數值。這樣的程式碼其實是相當重複的,當然通常你可能會透過 IDE 的擴充元件來快速建立這樣的語句 (例如 PHPStorm 跟 Visual Studio Code 的 Snippets),但在 PHP 8 這個問題已經被解決。

在 PHP 8 以前

在過去你可能會是這樣宣告物件,你會需要在類別中宣告屬性,並在建構子中重複的給予數值。

class Person
{
    public string $name;
    public string $email;
    public function __construct(string $name, string $email) {
        $this->name = $name;
        $this->email = $email;
    }
}

在 PHP 8 以後

你可以這樣做

class Person
{
    public function __construct(public string $name, public string $email) {}
}

透過在建構子的參數中指定類別變數可視範圍 (public, protected, private) 就能夠自動的宣告類別變數並自動賦予數值。當然如果你有需要特別處理傳入的值時,你還是得自行處理。這個建構子參數不一定會需要給予型別,但不能重複進行宣告。

不可以重複宣告

class Person
{
    public string $name; // <--- 會錯誤
    public function __construct(public string $name, public string $email) {}
}

可以不用給予型別

class Person
{
    public function __construct(public $name, public $email) {}
}