php 8.1/8.2 的数组展开(...)和 readonly array/readonly class 提升数组安全性与可读性:展开替代 array_merge() 更直观;只读数组防止运行时非法修改;只读类中数组属性实现不可变数据容器。

PHP 8.1 引入的数组展开(...)和只读数组(readonly array),加上 PHP 8.2 的只读类中对数组属性的支持,让数组操作更安全、更简洁。实战中真正用得上的不是语法糖,而是能规避错误、提升协作效率的特性。
用展开运算符替代 array_merge() 拼接更直观
以前拼多个数组要写 array_merge($a, $b, $c),嵌套调用时可读性差,还容易漏传参数。现在直接用 [...$a, ...$b, ...$c],语义清晰,支持任意位置展开,也兼容生成器和 Traversable 对象。
- 合并配置时,优先级一目了然:
$config = [...$defaults, ...$envOverrides, ...$userInput]; - 函数返回数组?不用先赋值再合并:
return [...getBaseFields(), 'updated_at' => date('c')]; - 注意:展开只作用于一维,深层嵌套仍需递归处理或专用工具函数
只读数组防止意外修改,特别适合配置与 DTO
readonly array 是 PHP 8.1 的关键增强——声明后不可追加、删除、重排、甚至不能改键名或键值。它不改变运行时行为,但会在引擎层拦截非法写入,抛出 Error。
专为中小型企业定制的网络办公软件,富有竞争力的十大特性: 1、独创 web服务器、数据库和应用程序全部自动傻瓜安装,建立企业信息中枢 只需3分钟。 2、客户机无需安装专用软件,使用浏览器即可实现全球办公。 3、集成Internet邮件管理组件,提供web方式的远程邮件服务。 4、集成语音会议组件,节省长途话费开支。 5、集成手机短信组件,重要信息可直接发送到员工手机。 6、集成网络硬
- 定义 API 响应结构:
readonly array $allowedFields = ['id', 'title', 'status'];,后续任何$allowedFields[] = 'created_by'都会失败 - 配合枚举做状态白名单:
readonly array $validStatuses = [PostStatus::DRAFT->value, PostStatus::PUBLISHED->value]; - 注意:只读性仅针对该变量本身,不递归保护内部元素;若存对象,对象属性仍可变
只读类 + 数组属性 = 更可靠的领域数据容器
PHP 8.2 允许在 readonly class 中声明数组属性,整个实例从构造起就不可变。这比手动写 getter、禁用 __set 更彻底,且被 IDE 和静态分析工具识别。
立即学习“PHP免费学习笔记(深入)”;
- 构建查询条件对象:
readonly class QueryParams { public function __construct(public readonly array $filters, public readonly array $sort) {} } - 避免“半只读”陷阱:以前用普通数组+文档约定“请勿修改”,现在类型系统强制保障
- 注意:构造时传入的数组本身仍可被外部修改,建议在构造方法内用
[...$input]复制一份
这些特性不追求炫技,而是把防御性编程变成默认行为。写配置、传参数、建 DTO 时多加一个 readonly 或几个点,就能挡住大量低级误操作。










