我试用了 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