我试用了 PHP 8.2 中新增的 ReadOnly 类!

您好!我是系统开发部的小出!

PHP 8.2 于 12 月 8 日发布!

今天我将介绍 PHP 8.2 版本中添加的只读类。

我们马上来看看。

只读类

在 PHP 8.1 中,现在可以为属性设置 readonly 修饰符。

在 PHP 8.2 中,现在可以为类设置 readonly 修饰符。

<?php readonly class SekarakuBlog { public string $title; }

上述操作会将类中的所有属性设置为只读。

<?php readonly class SekarakuBlog { public string $title; public function __construct() { $this-> title = '测试标题'; } } $test = new SekarakuBlog(); $test->title = '更改标题'; // 致命错误:未捕获的错误:无法修改只读属性 SekarakuBlog::$title $test->content = 'content'; // 致命错误:未捕获的错误:无法创建动态属性 SekarakuBlog::$content

如果尝试重写只读类中的属性,将会看到以下错误:

致命错误:未捕获的错误:无法修改只读属性 SekarakuBlog::$title

此外,禁止创建动态属性。

当我尝试创建动态属性时,出现以下错误:

致命错误:未捕获的错误:无法创建动态属性 SekarakuBlog::$content

此外,自 PHP 8.2 起,动态属性已被弃用。

您仍然可以通过添加 #[AllowDynamicProperties] 特性来使用动态属性。

但是,禁止在只读类中使用 #[AllowDynamicProperties],如果尝试在只读类中使用 #[AllowDynamicProperties],将会收到以下错误:

<?php #[AllowDynamicProperties] readonly class SekarakuBlog {} // Fatal error: Cannot apply #[AllowDynamicProperties] to readonly class SekarakuBlog

类型

<?php readonly class SekarakuBlog { public $title; public function __construct() { $this->title = '测试标题'; } } $test = new SekarakuBlog(); // 致命错误:只读属性 SekarakuBlog::$title 必须具有类型

请注意,如果您未为属性定义类型,则会发生错误。

遗产

可以从另一个只读类继承只读类。

禁止用非只读类继承只读类,也禁止用只读类继承非只读类。

# 以下是 OK readonly class SekarakuBlog {} readonly class ExtendSekaraku extends SekarakuBlog {} # 以下是 NG class SekarakuBlog {} readonly class ExtendSekaraku extends SekarakuBlog {} // 致命错误:Readonly class ExtendSekaraku 无法扩展非只读 class SekarakuBlog readonly class SekarakuBlog {} class ExtendSekaraku extends SekarakuBlog {} // 致命错误:非只读类ExtendSekaraku 无法扩展只读类 SekarakuBlog

现在可以使用以下方法检查一个类是否为只读类。

只读类 SekarakuBlog {} $reflectionClass = new ReflectionClass('SekarakuBlog'); $reflection->isReadOnly(); // true

与最终职业修饰符的区别

我们还会简要介绍一下只读类和最终类修饰符之间的区别。

如上所述,只读类可以相互继承,但带有 final 类修饰符的类不能相互继承。

你不能扩展一个类。

顺便说一下,如果您不想扩展类或重写值,您可以编写以下代码。

<?php final readonly class Sekaraku { public string $hoge; public function __construct() { $this-> hoge = 'hoge'; } } $test = new Sekaraku(); $test->hoge = 'test'; // 致命错误:未捕获的错误:无法修改只读属性 Sekaraku::$hoge,位于 /var/www/html/docker/php/finalreadonly.php:17 readonly class Lab extends Sekaraku {} $test2 = new Lab(); // 致命错误:类 Lab 不能扩展 final 类 Sekaraku,位于 /var/www/html/docker/php/finalreadonly.php 第 20 行

优点

使用只读类可以省去为每个属性设置只读修饰符的麻烦。

一旦设置了值,就无法重写,也可以禁止动态属性,因此编写更健壮的代码似乎是可能的。

概括

PHP 8.2 这次还添加了一些其他功能,但总体来说,似乎有很多小的改进。

我个人认为,弃用动态属性对 PHP 的未来影响重大。

(当你在类外部声明一个类属性时,就很难知道该属性是在哪里声明的。)

这是因为我认为这会降低调试效率。)

我认为很多人都在使用这款软件,所以升级版本时需要格外小心。

我希望有机会再次向您介绍它!

祝你拥有美好的 PHP 生活!

如果您觉得这篇文章有帮助,请点赞!
7
加载中...
7 票,平均:1.00 / 17
2,357
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

小出正吾

出生于大阪。 热爱桑拿的工程师。 休息日,我去桑拿,与宇宙交流。 我们每个工作日早上8:30到9:30在公司召开早会,我担任早会的主席。 在工作中,我主要负责使用PHP进行开发。