php 8.6允许实例只读属性直接声明默认值,可用于实现接口要求的只读元数据。当前php 8.6仍处候选发布测试阶段,下面的写法用于理解新规则和准备兼容测试,不能直接套到较早版本或据此把生产环境切换到rc版本。

先确认目标版本
官方Readonly Property Defaults RFC标为已实现,目标为PHP 8.6。8.6之前的实例只读属性声明默认值仍受编译期限制,检查代码时要核对实际解释器与静态分析工具版本。
直接为只读属性声明默认值
<?php
final class TaskOptions
{
public readonly int $priority = 1;
}
$options = new TaskOptions();
echo $options->priority;默认值在对象建立时完成初始化,无需再由构造函数重复赋值。声明为readonly class时,成员属性隐式只读,也适用默认值规则。
实现只要求读取的接口属性
<?php
interface NamedRule
{
public string $name { get; }
}
final class DefaultRule implements NamedRule
{
public readonly string $name = 'default';
}该属性可以满足接口的get要求,但不能满足同时要求get和set的接口。适用场景是固定的实例元数据,并未把只读属性变成可反复修改的普通属性。
默认值已经算一次初始化
对象创建后再在构造函数中为同一属性赋值,会被视为修改已初始化的只读属性而失败。普通后续赋值或unset同样受限制;类型检查、常量表达式等既有条件没有取消。
立即学习“PHP免费学习笔记(深入)”;



















