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