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