Веб Мастерская | Веб разработка и программирование | ИТ | IT
Без категории · 8 сентября 2026 г.
PHP:
PHP: Readonly свойства в PHP: почему ваш код станет чище Коллеги, знакомая ситуация? Передаёте объект в сервис, а он вам его тихонько мутировал. Или в DTO кто-то в цикле подправил total, а вы узнаёте об этом от клиента. В проде. В пятницу вечером. Раньше мы писали геттеры без сеттеров, городили @internal, молились. А с PHP 8.1 у нас появился нормальный инструмент — readonly. Что делает readonly на практике Свойство можно записать один раз — при инициализации или в конструкторе. Любая попытка изменить его после — фатальная ошибка. Не warning, не notice, а именно Error. Код падает сразу, а не гниёт молча. Было (боль) class Order { public int $id; public float $total; public string $status; public function construct(int $id, float $total, string $status) { $this->id = $id; $this->total = $total; $this->status = $status; } } $order = new Order(1, 5000.0, 'paid'); $order->total = 0; // 💀 Тихо. Страшно. В проде. .. Стало (порядок) class Order { public function construct( public readonly int $id, public readonly float $total, public string $status, // статус реально меняется ) {} } $order = new Order(1, 5000.0, 'paid'); $order->total = 0; // ❌ Fatal Error: Cannot modify readonly property .. Никаких сеттеров, никаких «ой, я не знал, что нельзя». Язык сам охраняет. Пара правил из мастерской — Используйте readonly для DTO и Value Objects. Money, Address, UserId — всё, что по смыслу не должно меняться после создания. — С PHP 8.2 можно объявить весь класс как readonly: readonly class InvoiceCreated { public function construct( public int $invoiceId, public float $amount, public DateTimeImmutable $createdAt, ) {} } Все свойства автоматически становятся readonly. Идеально для событий, команд, конфигов. — В связке с DateTimeImmutable получаете по-настоящему иммутабельные объекты. Никаких сюрпризов с ->modify(). Почему это не паранойя, а гигиена В команде вы не контролируете, кто и где дёргает ваш объект. readonly — это замок на двери. Ревью кода ускоряется: видишь readonly — значит, объект неизменяемый, не надо искать, где его мутируют. Начните с малого: в следующем DTO пометьте readonly хотя бы id и createdAt. Уже почувствуете, как дышится легче. Вот так. Идем кодить дальше! 🚀 #вебмастерская #php #readonly #php81 #php82 #чистыйкод #ооп #вебразработка #бэкенд #dto #valueobjects #иммутабельность #рефакторинг #разработка #сергейабрамов