php

多年来 PHP 对象的演变

dafenqi
2023-08-12 / 0 评论 / 7 阅读 / 正在检测是否收录...

多年来 PHP 对象的演变

这有趣的小帖子可视化数据传输对象这些年来是如何演变的。

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

0

Deprecated: strtolower(): Passing null to parameter #1 ($string) of type string is deprecated in /www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php on line 1032

评论 (0)

取消