Ответ
В 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 пользователя или дата его создания. Подозрение ебать чувствую к коду, где это можно поменять после факта.
- Повышение надёжности. Просто берёшь и наглухо запрещаешь менять критически важные свойства. Волнение ебать отступает — ты точно знаешь, что они не поплывут.