这只是我写的一个有趣的小帖子,因为我想可视化我的数据传输对象这些年来是如何演变的。

#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 语法,您可能会被称为疯子。今天也是如此,我相信我们会在十年后回顾这一点,并想知道“我们是怎么忍受的?”。

 

via https://stitcher.io/blog/evolution-of-a-php-object

多年来 PHP 对象的演变
标签: