4

readonly现在在 PHP 8.1 中可用,我只是想知道它有什么用?这是为了帮助编辑知道这个属性是公正readonly的还是帮助客户知道或者还有其他好处?

4

1 回答 1

5

readonlyproperties 允许您创建不可变的对象,或者至少是不可变的属性。

这样,您可以确保在对象的整个生命周期内初始化后不会意外更改值。

这是一个与常量(通过constor设置define)非常相似的概念,尽管有两个重要区别:

  • 常量需要在“编译”时定义,而readonly属性将在运行时设置,通常是在对象实例化期间(因此多个实例将能够保存不同的值*)
  • 与存在于全局范围内的常量相反,对于类常量,它们的值与类而不是实例相关联。

可以使用只能通过 getter 访问的私有属性来实现相同的目的。例如,在“过去”:

class Foo {

    private DateTimeImmutable $createAt;

    public function __construct() {
        $this->createdAt = new DateTimeImmutable();
    }

    public 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')
于 2021-12-06T12:54:38.630 回答