0

0

PHP 8.1 readonly 属性详解:构建不可变对象的现代实践

DDD

DDD

发布时间:2025-11-10 13:05:00

|

286人浏览过

|

来源于php中文网

原创

PHP 8.1 readonly 属性详解:构建不可变对象的现代实践

php 8.1 引入的 `readonly` 关键字,旨在简化不可变对象的创建。它允许属性在初始化后保持不变,有效防止意外修改,减少传统 getter 方法的样板代码,并提升代码的清晰度和安全性。php 8.2 进一步引入了 `readonly` 类,使得整个类的公共属性默认为只读,为构建更健壮的应用提供了强大支持。

引言:不可变性与 readonly 属性

软件开发中,不可变性(Immutability)是一个重要的概念,它指的是对象在创建后,其内部状态不能被修改。不可变对象带来了诸多好处,例如提高并发安全性、简化状态管理、减少错误等。然而,在 PHP 中实现不可变属性往往需要编写额外的样板代码。

为了解决这一痛点,PHP 8.1 引入了 readonly 关键字,允许开发者在属性声明时明确指定其为只读。这意味着一旦属性被初始化(通常在构造函数中),其值便不能再被修改。这一特性显著提升了代码的简洁性和安全性,为构建不可变对象提供了原生支持。

readonly 属性的核心价值

readonly 属性的主要价值体现在以下几个方面:

  • 强制不可变性:readonly 关键字确保了属性在对象生命周期中,其值在初始化后不会被意外或恶意修改。这对于表示配置、ID、创建时间等不应变动的数据尤为重要。
  • 减少样板代码:在 readonly 出现之前,实现不可变属性通常需要将属性声明为 private,并通过一个公共的 getter 方法来访问。readonly 属性结合构造函数属性提升(Constructor Property Promotion)可以极大地简化这一过程。
  • 提高代码可读性与意图明确性:通过 readonly 关键字,开发者可以一目了然地知道某个属性是只读的,这有助于团队成员更好地理解代码的设计意图和数据流向。
  • 辅助静态分析工具:编辑器和静态分析工具可以识别 readonly 属性,从而提供更准确的代码检查和建议。

readonly 与 const:关键区别解析

readonly 属性与 const(常量)都用于定义不可变的值,但它们之间存在重要的区别:

立即学习PHP免费学习笔记(深入)”;

  • 初始化时机
    • const:常量在“编译时”定义,其值必须在代码编写阶段就确定,并且在整个应用程序生命周期中保持不变。它们不能在运行时动态赋值。
    • readonly:只读属性在“运行时”定义,通常在对象实例化时通过构造函数进行初始化。这意味着不同的对象实例可以拥有不同的只读属性值。
  • 作用域
    • const:类常量绑定到类本身,不属于任何特定的对象实例。全局常量则在全局作用域中。
    • readonly:只读属性是对象实例的一部分,其值与特定的对象实例相关联。
  • 灵活性
    • const:一旦定义,其值固定不变,无法根据运行时逻辑进行调整。
    • readonly:允许在对象创建时根据传入的参数动态设置初始值,提供了更大的灵活性。

实践演进:从手动实现到 readonly 简化

为了更好地理解 readonly 带来的便利,我们来看一下实现不可变属性的演进过程。

传统不可变属性的实现方式

在 PHP 8.1 之前,如果我们需要一个在创建后不能被修改的属性,通常会将其声明为私有,并提供一个公共的只读访问器(getter):

class Foo
{
    private DateTimeImmutable $createdAt;

    public function __construct()
    {
        $this->createdAt = new DateTimeImmutable();
    }

    public function getCreatedAt(): DateTimeImmutable
    {
        return $this->createdAt;
    }
}

$f = new Foo();
echo $f->getCreatedAt()->format('Y-m-d H:i:s');
// 尝试修改会报错或无效
// $f->createdAt = new DateTimeImmutable(); // 错误:不能访问私有属性

这种方式虽然实现了不可变性,但需要为每个不可变属性编写额外的私有属性声明和公共 getter 方法,增加了不少样板代码。

ModelGate
ModelGate

一站式AI模型管理与调用工具

下载

PHP 8.1 readonly 属性的应用

PHP 8.1 引入 readonly 关键字后,结合构造函数属性提升,可以大大简化上述代码:

class Foo
{
    public function __construct(
        public readonly DateTimeImmutable $createdAt = new DateTimeImmutable()
    ) { }
}

$f = new Foo();
echo $f->createdAt->format('Y-m-d H:i:s');

// 尝试修改会抛出错误:
// Fatal error: Uncaught Error: Cannot modify readonly property Foo::$createdAt
// $f->createdAt = new DateTimeImmutable();

通过 public readonly 声明,createdAt 属性在构造函数中初始化后便不可修改。代码变得更加简洁,意图也更加明确。

PHP 8.2 readonly 类的引入

PHP 8.2 更进一步,引入了 readonly 类。当一个类被声明为 readonly 时,该类中的所有公共(public)属性都将自动变为只读,无需为每个属性单独添加 readonly 关键字。

readonly class Foo
{
    public function __construct(
        public string $name,
        public DateTimeImmutable $createdAt = new DateTimeImmutable()
    ) { }
}

$f = new Foo('My Foo Instance');
echo $f->name . ' created at ' . $f->createdAt->format('Y-m-d H:i:s');

// 尝试修改 $f->name 会抛出错误:
// Fatal error: Uncaught Error: Cannot modify readonly property Foo::$name
// $f->name = 'New Name';

// 尝试修改 $f->createdAt 也会抛出错误:
// Fatal error: Uncaught Error: Cannot modify readonly property Foo::$createdAt
// $f->createdAt = new DateTimeImmutable();

readonly 类使得创建完全不可变的对象变得异常简单,尤其适用于值对象(Value Objects)或数据传输对象(DTOs)等场景。

使用 readonly 的注意事项

在使用 readonly 属性和类时,需要注意以下几点:

  • 类型声明是必需的:readonly 属性必须具有明确的类型声明。
  • 初始化一次:只读属性只能在声明时或在构造函数中初始化一次。一旦被赋值,就不能再次赋值。
  • 不能重新赋值:尝试在构造函数之外重新赋值一个只读属性会导致 Error。
  • readonly 类中的私有属性:在一个 readonly 类中,私有(private)属性虽然不能被外部访问,但其值同样只能在构造函数中初始化一次,之后也不能在类内部的其他方法中被修改。
  • 不能与 static 结合:readonly 关键字不能用于静态属性。
  • 不能与 unset() 结合:不能对 readonly 属性使用 unset()。

总结

PHP 8.1 引入的 readonly 属性以及 PHP 8.2 扩展的 readonly 类,是 PHP 语言在支持不可变性方面迈出的重要一步。它们提供了一种简洁、安全且高效的方式来创建不可变对象,有效减少了样板代码,提升了代码的清晰度和可维护性。通过合理利用 readonly 特性,开发者可以构建出更健壮、更易于理解和测试的 PHP 应用程序。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1568

2023.10.24

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

25

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

44

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

177

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

50

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号