本文系翻譯,原文地址:https://stitcher.io/blog/php-81-new-in-initializers
PHP 8.1:初始化器(new in initializers)
PHP 8.1 添加了一個看似很小的細節(jié),但我認為它會對許多人產(chǎn)生重大的日常影響。那么這個“初始化器 RFC 中的新內(nèi)容”是關于什么的?我們來看一個例子;我們都寫過這樣的代碼:
class MyStateMachine { public function __construct( private ?State $state = null, ) { $this->state ??= new InitialState(); } }
在這個狀態(tài)機示例中,我們想以兩種方式構造我們的類:有和沒有初始狀態(tài)。如果我們在沒有初始狀態(tài)的情況下構建它,我們希望設置一個默認狀態(tài)。PHP 當然支持直接在參數(shù)列表中設置初始值,但僅適用于原始類型。例如,如果我們的狀態(tài)機在內(nèi)部使用字符串而不是對象,我們就可以像這樣編寫它的構造函數(shù):
class MyStateMachine { public function __construct( private string $state = 'initial', ) { } }
因此,在 PHP 8.1 中,我們也可以對對象使用相同的“默認值”語法。換句話說:您可以使用new默認參數(shù)(這是“初始化程序”的一個示例):
class MyStateMachine { public function __construct( private State $state = new InitialState(), ) { } }
“初始化器”不僅僅是參數(shù)默認值,這里有一個來自 RFC 的簡單解釋:
該 RFC 提議允許在參數(shù)默認值、屬性參數(shù)、靜態(tài)變量初始值設定項和全局常量初始值設定項中使用新表達式
你沒看錯:屬性也在這個列表中!想象一個簡單的驗證庫,它使用特性來驗證屬性的輸入。也許它應該能夠驗證數(shù)組元素,如下所示:
class CreateEmailsRequest extends FormRequestData { #[ValidArray( email: [new Required, new ValidEmail], name: [new Required, new ValidString], )] public array $people; }
在 PHP 8.1 之前,您將無法編寫此類代碼,因為new由于它們的評估方式,您不允許在屬性中使用,但現(xiàn)在您可以了!
讓我們來看看一些值得一提的重要細節(jié)。
您想要了解