【问题标题】:What is the benefit of readonly in PHP 8.1?PHP 8.1 中 readonly 的好处是什么?
【发布时间】:2022-01-11 13:29:43
【问题描述】:

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

【问题讨论】:

  • 主要的好处是它有助于创建不可变的数据结构 (en.wikipedia.org/wiki/Immutable_object)。在 PHP 8.1 之前的版本中,可以通过为属性创建一个 getter 而没有 setter 来做到这一点,但是 readonly 关键字以更易读和更短的形式实现了同样的事情。
  • wiki.php.net/rfc/readonly_properties_v2 包含了将该功能引入 PHP 的论证,也许这已经有所帮助?

标签: php oop php-8.1


【解决方案1】:

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

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

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

  • 需要在“编译”时定义常量,而 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')

【讨论】:

    猜你喜欢
    • 2017-12-12
    • 2011-10-12
    • 2013-01-27
    • 2019-10-09
    • 1970-01-01
    • 2015-03-30
    • 2011-07-20
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多