在 PHP 8.1 中,readonly 关键字现已可用。我很好奇它的目的。是为了帮助编辑者认识到属性是只读的,还是为了帮助客户理解这一特性,还是有其他目的?
readonly
属性允许您创建不可变的对象,或者至少是不可变的属性。
这样您就可以确保在初始化后,在对象的整个生命周期中,值不会意外更改。
这是一个与常量非常相似的概念(通过
const
或 define
设置),尽管有两个重要的区别:
readonly
属性将在运行时设置,通常是在对象实例化期间(因此多个实例将能够保存不同的值*)您可以使用只能通过吸气剂访问的私有财产来实现相同的目的。例如,在“过去的日子”:
class Foo {
private DateTimeImmutable $createAt;
public function __construct() {
$this->createdAt = new DateTimeImmutable();
}
public function getCreatedAt(): DateTimeImmutable
{
return $this->createdAt;
}
}
$f = new Foo();
echo $f->getCreatedAt()->format('Y-m-d H:i:s');
唯一的问题是它需要大量样板代码。
使用 PHP 8.1。通过这样做可以实现同样的目的:
class Foo
{
public function __construct(
public readonly DateTimeImmutable $createdAt = new DateTimeImmutable()
)
{ }
}
$f = new Foo();
echo $f->createdAt->format('Y-m-d H:i:s')