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

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

WebStorm Mac版
好用的JavaScript開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。