本文系翻译,原文地址: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由于它们的评估方式,您不允许在属性中使用,但现在您可以了!
让我们来看看一些值得一提的重要细节。
您想要了解