我尝试了 PHP 8.2 中添加的 ReadOnly 类!
你好!我是系统开发部的小出!
PHP 8.2 于 12 月 8 日发布!
今天写一下PHP 8.2中添加的只读类。
那么让我们来看看吧。
只读类
PHP 8.1 现在允许您在属性上设置只读修饰符。
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(); // 致命错误:未捕获错误:无法修改只读属性 SekarakuBlog::$title $test->content = 'content'; // 致命错误:未捕获错误:无法创建动态属性 SekarakuBlog::$content
可以看到,当尝试重写readonly类中的属性时,出现以下错误。
致命错误:未捕获错误:无法修改只读属性 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 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 无法扩展非readonly class SekarakuBlog readonly class SekarakuBlog { } class ExtendSekaraku extends SekarakuBlog {} // 致命错误:非只读类 ExtendSekaraku 无法扩展只读类 SekarakuBlog
通过使用下面的方法,您现在可以检查该类是否是只读的。
readonly class SekarakuBlog {} $reflectionClass = new ReflectionClass('SekarakuBlog'); $reflection->isReadOnly();
与 Final 类修饰符的区别
我们还将讨论只读类和最终类修饰符之间的区别。
如上所述,只读类可以相互继承,但具有 Final 类修饰符的类
无法延长班级。
顺便说一句,如果你不想扩展类或重写值,你可以编写以下内容。
<?php final readonly class Sekaraku { public string $hoge; public function __construct() { $this-> hoge = 'hoge'; } } $test = new Sekaraku(); // 致命错误:未捕获错误:无法修改 /var/www/html 中的只读属性 Sekaraku::$hoge /docker/php/finalreadonly.php:17 readonly class Lab extends Sekaraku {} $test2 = new Lab(); // 致命错误:Class Lab 无法扩展 /var/www/html/docker/php/finalreadonly 中的 Final class Sekaraku .php 第 20 行
优点
通过使用 readonly 类,您不必为每个属性设置 readonly 修饰符,这可以节省您的时间。
一旦设置了值,就无法更改,并且可以禁止动态属性,因此似乎可以编写更健壮的代码。
概括
这次 PHP 8.2 还添加了其他功能,但总的来说,我的印象是有很多小的添加。
就我个人而言,我认为动态属性的弃用将是 PHP 未来的一件大事。
(如果你在类之外声明一个类属性,你将不知道该属性是在哪里声明的。
这是因为我相信调试效率会降低。 )
我想很多人都在用,所以升级版本的时候需要小心。
我也想给你介绍一下!
祝您PHP生活愉快!