Loading... # [多年来 PHP 对象的演变](https://blog.p2hp.com/archives/9110) 这有趣的小帖子可视化数据传输对象这些年来是如何演变的。 #2014 年 8 月:PHP 5.6 让我们从 PHP 5.6 开始,这是大多数没有现代 PHP 知识的人可能认为 PHP 代码仍然看起来的样子。我只会给你代码,我会提到未来版本的变化。 class BlogData { /** @var string */ private $title; /** @var State */ private $state; /** @var \DateTimeImmutable|null */ private $publishedAt; /** * @param string $title * @param State $state * @param \DateTimeImmutable|null $publishedAt */ public function __construct( $title, $state, $publishedAt = null ) { $this->title = $title; $this->state = $state; $this->publishedAt = $publishedAt; } /** * @return string */ public function getTitle() { return $this->title; } /** * @return State */ public function getState() { return $this->state; } /** * @return \DateTimeImmutable|null */ public function getPublishedAt() { return $this->publishedAt; } } #2015 年 12 月:PHP 7.0 PHP 7.0 引入了一些主要的新语法特性:标量类型和返回类型是这里最值得注意的。Nullable 类型还不是一个东西,所以我们仍然需要为我们的 nullable 使用 doc 块类型$publishedAt: class BlogData { /** @var string */ private $title; /** @var State */ private $state; /** @var \DateTimeImmutable|null */ private $publishedAt; /** * @param \DateTimeImmutable|null $publishedAt */ public function __construct( string $title, State $state, $publishedAt = null ) { $this->title = $title; $this->state = $state; $this->publishedAt = $publishedAt; } public function getTitle(): string { return $this->title; } public function getState(): State { return $this->state; } /** * @return \DateTimeImmutable|null */ public function getPublishedAt() { return $this->publishedAt; } } #2016 年 12 月:PHP 7.1 PHP 7.1 终于出现了可以为空的类型,所以我们可以删除更多的文档块: class BlogData { /** @var string */ private $title; /** @var State */ private $state; /** @var \DateTimeImmutable|null */ private $publishedAt; public function __construct( string $title, State $state, ?DateTimeImmutable $publishedAt = null ) { $this->title = $title; $this->state = $state; $this->publishedAt = $publishedAt; } public function getTitle(): string { return $this->title; } public function getState(): State { return $this->state; } public function getPublishedAt(): ?DateTimeImmutable { return $this->publishedAt; } } #2017 年 11 月:PHP 7.2 虽然 7.2 中有一些令人兴奋的功能,例如参数类型扩展和object类型,但我们无法在此版本中清理特定的 DTO。 #2018 年 12 月:PHP 7.3 PHP 7.3也是如此,这里没什么可看的。 #2019 年 11 月:PHP 7.4 PHP 7.4是一个不同的故事!现在有了类型化的属性——终于! class BlogData { private string $title; private State $state; private ?DateTimeImmutable $publishedAt; public function __construct( string $title, State $state, ?DateTimeImmutable $publishedAt = null ) { $this->title = $title; $this->state = $state; $this->publishedAt = $publishedAt; } public function getTitle(): string { return $this->title; } public function getState(): State { return $this->state; } public function getPublishedAt(): ?DateTimeImmutable { return $this->publishedAt; } } 我如何在不到 5 分钟的时间内将 PhpStorm 设置为干净且最小化。 干净简约的 PhpStorm干净简约的 PhpStorm #2020 年 11 月:PHP 8.0 另一个游戏规则改变者:PHP 8增加了提升属性;此外,参数列表中的尾随逗号现在是一回事! class BlogData { public function __construct( private string $title, private State $state, private ?DateTimeImmutable $publishedAt = null, ) {} public function getTitle(): string { return $this->title; } public function getState(): State { return $this->state; } public function getPublishedAt(): ?DateTimeImmutable { return $this->publishedAt; } } #2021 年 11 月:PHP 8.1 接下来,我们到达PHP 8.1。只读属性是一个东西,它允许我们像这样编写我们的 DTO: class BlogData { public function __construct( public readonly string $title, public readonly State $state, public readonly ?DateTimeImmutable $publishedAt = null, ) {} } #2022 年 11 月:PHP 8.2 最后,我们到达了PHP 8.2——尚未发布。每当一个类只有只读属性时,可以将类本身标记为只读,而不是每个单独的属性: readonly class BlogData { public function __construct( public string $title, public State $state, public ?DateTimeImmutable $publishedAt = null, ) {} } 那是完全不同的,你不觉得吗? 看看这门语言在近十年的时间里是如何演变的很有趣。如果您在 10 年前提出 8.2 语法,您可能会被称为疯子。今天也是如此,我相信我们会在十年后回顾这一点,并想知道“我们是怎么忍受的?”。 最后修改:2023 年 08 月 12 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏