站长资讯网
最全最丰富的资讯网站

PHP8.1新特性大讲解之initializers初始化器

本文系翻译,原文地址: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由于它们的评估方式,您不允许在属性中使用,但现在您可以了!

让我们来看看一些值得一提的重要细节。

您想要了解

赞(0)
分享到: 更多 (0)
网站地图   沪ICP备18035694号-2    沪公网安备31011702889846号