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

本文系翻譯,原文網址: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中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具