这只是我写的一个有趣的小帖子,因为我想可视化我的数据传输对象这些年来是如何演变的。
#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;
}
}
#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 对象的演变