首頁 > 後端開發 > PHP8 > PHP8.1新特性大講解之initializers初始化器

PHP8.1新特性大講解之initializers初始化器

藏色散人
發布: 2023-02-17 12:14:02
原創
3040 人瀏覽過

本文系翻譯,原文網址:https://stitcher.io/blog/php-81-new-in-initializers

PHP 8.1:初始化器( new in initializers)

PHP 8.1 添加了一個看似很小的細節,但我認為它會對許多人產生重大的日常影響。那麼這個「初始化器 RFC 中的新內容」是關於什麼的?我們來看一個例子;我們都寫過這樣的程式碼:

class MyStateMachine
{
    public function __construct(
        private ?State $state = null,
    ) {
        $this->state ??= new InitialState();
    }
}
登入後複製

在這個狀態機範例中,我們想以兩種方式建構我們的類別:有和沒有初始狀態。如果我們在沒有初始狀態的情況下建立它,我們希望設定一個預設狀態。 PHP 當然支援直接在參數清單中設定初始值,但僅適用於原始類型。例如,如果我們的狀態機在內部使用字串而不是對象,我們就可以像這樣編寫它的構造函數:

class MyStateMachine
{
    public function __construct(
        private string $state = 'initial',
    ) {
    }
}
登入後複製

因此,在PHP 8.1 中,我們也可以對對象使用相同的“預設值”語法。換句話說:您可以使用new預設參數(這是「初始化程式」的範例):

class MyStateMachine
{
    public function __construct(
        private State $state = new InitialState(),
    ) {
    }
}
登入後複製

「初始化器」不僅僅是參數預設值,這裡有一個來自RFC 的簡單解釋:

該RFC 提議允許在參數預設值、屬性參數、靜態變數初始值設定項和全域常數初始值設定項中使用新表達式

你沒看錯:屬性也在這個清單中!想像一個簡單的驗證庫,它使用特性來驗證屬性的輸入。也許它應該能夠驗證數組元素,如下所示:

class CreateEmailsRequest extends FormRequestData
{
    #[ValidArray(
        email: [new Required, new ValidEmail],
        name: [new Required, new ValidString],
    )]
    public array $people;
}
登入後複製

在PHP 8.1 之前,您將無法編寫此類程式碼,因為new由於它們的評估方式,您不允許在屬性中使用,但現在您可以了!

讓我們來看看一些值得一提的重要細節。

您想要了解更多關於 PHP 8.1 的資訊嗎?有通往 PHP 8.1 的道路。在接下來的 10 天內,您將每天收到一封電子郵件,內容涉及 PHP 8.1 的一個新的和現有的功能;之後您將自動退訂,因此不會收到垃圾郵件或後續郵件。現在訂閱!

#僅在需要時建構

這些「新價值」只會在實際需要時才會被建構。這意味著,在我們的第一個範例中,InitialState如果沒有給予參數,PHP 只會建立一個新物件:

class MyStateMachine
{
    public function __construct(
        private State $state = new InitialState(),
    ) {
    }
}
new MyStateMachine(new DraftState()); // No InitialState is created
new MyStateMachine(); // But now it is
登入後複製

例如,在屬性的情況下,只有newInstance在反射屬性上呼叫時才會創建物件。

#不在類別屬性中

您也應該知道不能new在類別屬性中用作預設值。支援此功能會引入許多無法預料的副作用,例如,在序列化和反序列化物件時。

class MyStateMachine
{
    private State $state = new InitialState();
}
登入後複製

幸運的是,我們提升了允許預設值的屬性,因為 PHP 將轉換屬性提升語法,在建構函式參數中保留預設值,但不在實際屬性中。

以下是轉譯後的版本:

class MyStateMachine
{
    private State $state;
    
    public function __construct(
        State $state = new InitialState(),
    ) {
        $this->state = $state;
    }
}
登入後複製

#有限的投入

您可能已經猜到了,但是在初始化程序中建構新對象時,您只能傳遞一組有限的輸入。例如,您不能使用變數、展開運算子、匿名類別等。不過,這是一個非常受歡迎的補充!

以上是PHP8.1新特性大講解之initializers初始化器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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