Что такое модификатор доступа readonly в PHP?

Ответ

В PHP модификатор readonly применяется к типизированным свойствам класса, делая их доступными только для чтения после инициализации.

Ключевые особенности:

  • Значение можно присвоить только один раз — при объявлении или в конструкторе класса.
  • Любая последующая попытка изменения свойства вызовет Error.
  • Требует явного указания типа (не работает с mixed или нетипизированными свойствами).

Пример использования:

class UserDto {
    public readonly string $email;
    public readonly DateTimeImmutable $createdAt;

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

$user = new UserDto('test@example.com');
echo $user->email; // test@example.com
// $user->email = 'new@example.com'; // Вызовет Fatal error: Cannot modify readonly property

Практическое применение:

  • Создание DTO (Data Transfer Objects) и Value Objects, которые должны быть иммутабельными.
  • Моделирование сущностей с неизменяемыми идентификаторами или датами создания.
  • Повышение надёжности кода, явно запрещая изменение критических свойств после создания объекта.

Ответ 18+ 🔞

Давай разберем эту штуку, а то народ путается. В PHP есть модификатор readonly, и он, блядь, как строгий отец для свойств класса — один раз задал значение и всё, пиши пропало, больше не тронешь.

Что он делает, если по-простому:

  • Значение можно впендюрить только один раз — либо сразу при объявлении, либо в конструкторе. Всё.
  • Попробуешь потом изменить — получишь Error прямо в лоб, ядрёна вошь. Никаких компромиссов.
  • И да, он упёртый — требует, чтобы тип свойства был указан явно. С mixed или без типа не прокатит, доверия ебать ноль.

Смотри, как это выглядит в деле:

class UserDto {
    public readonly string $email;
    public readonly DateTimeImmutable $createdAt;

    public function __construct(string $email) {
        $this->email = $email; // Всё, приехали, это его final destination
        $this->createdAt = new DateTimeImmutable(); // И эту дату теперь не сдвинешь
    }
}

$user = new UserDto('test@example.com');
echo $user->email; // test@example.com
// $user->email = 'new@example.com'; // А вот это вызовет Fatal error: Cannot modify readonly property. Пизда рулю твоим планам.

Где эту фигню реально применить, чтобы не было мучительно больно:

  • DTO (Data Transfer Objects) и Value Objects. Создал объект с данными — и спи спокойно, никто их случайно не перепишет, пока они путешествуют по коду. Иммутабельность, ёпта.
  • Сущности с несменяемыми полями. Ну, например, ID пользователя или дата его создания. Подозрение ебать чувствую к коду, где это можно поменять после факта.
  • Повышение надёжности. Просто берёшь и наглухо запрещаешь менять критически важные свойства. Волнение ебать отступает — ты точно знаешь, что они не поплывут.