[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

我尝试了 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生活愉快!

如果您觉得这篇文章有帮助,请点赞!
7
加载中...
7 票,平均:1.00 / 17
1,571
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

写这篇文章的人

关于作者

小出正吾

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