php 8.1+ 的 readonly 是语言级修饰符而非内置函数,仅用于类属性(含静态属性),须在声明时或构造函数中初始化,不可用于局部变量或函数签名。

PHP 8.1+ 中的只读属性(readonly)不是通过“内置函数”声明的,而是作为语言级关键字,直接用在类属性声明处。它不属于函数、也不依赖任何内置函数调用,而是一种修饰符(modifier),语法上紧贴可见性关键字(如 public、protected、private)之后。
✅ 正确声明方式:直接写在属性前
class User
{
public readonly string $id;
protected readonly int $score;
private readonly array $tags;
public function __construct(string $id, int $score, array $tags)
{
$this->id = $id; // ✅ 允许:构造函数中首次赋值
$this->score = $score;
$this->tags = $tags;
}
}
⚠️ 注意:
readonly不能用于局部变量、函数参数或返回类型,仅适用于类的实例属性(PHP 8.1)和静态属性(PHP 8.1+,需配合static)。
✅ 只读静态属性(PHP 8.1+ 支持)
class Config
{
public static readonly string $APP_ENV = 'production';
private static readonly array $DEFAULT_ROLES = ['user', 'guest'];
// ❌ 构造函数中不能给 static readonly 赋值
// ✅ 必须在声明时初始化,或使用静态初始化器(PHP 8.2+)
}
? PHP 8.2+ 还支持静态初始化器(
static {}),可用于更复杂的只读静态属性初始化。
❌ 常见错误写法(都不是合法声明)
| 错误示例 | 说明 |
|---|---|
readonly($id) 或 readonly('id')
|
readonly 不是函数,不能加括号调用 |
function readonlyProperty() { ... } |
没有“只读属性函数”,这是概念混淆 |
public function getId(): readonly string |
readonly 不能用在返回类型或参数类型中 |
✅ 配合构造函数属性提升(PHP 8.0+)一起用更简洁
class Product
{
public function __construct(
public readonly string $name,
public readonly float $price,
private readonly DateTimeImmutable $createdAt,
) {}
}
✅ 这种写法自动声明属性 + 类型 + 可见性 +
readonly+ 构造赋值,一步到位。
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











