Веб Мастерская | Веб разработка и программирование | ИТ | IT
Без категории · 6 октября 2026 г.
PHP:
PHP: Конструктор, который пишет код за тебя: Property Promotion в PHP Коллеги, признавайтесь. Кто из вас в 2015 году копипастил в PHPStorm переменные из конструктора в свойства класса? Сценарий до боли знакомый: объявляешь private string $host;, затем в конструкторе public function __construct(string $host), а внутри $this->host = $host;. И так десять раз подряд для базы данных, логина, пароля, лимитов… Тонна однотипного, шумного кода, который не несет никакой бизнес-логики. Чистый бэктрейн-болид. В PHP 8.0 (а сегодня, на секундочку, конец 2026 года, и мы давно живем в экосистеме 8.3+) эту рутину официально убили. Знакомьтесь — Constructor Property Promotion. Как это работает Суть фичи проста: мы объединяем объявление свойства, его тип и прием аргумента в конструкторе в одну короткую строчку. Модификаторы видимости (public, protected, private) прямо перед параметром функции говорят интерпретатору: «Сделай из этого параметра полноценное свойство класса». Ситуация «До» (PHP 7.x и ниже): class DatabaseConfig { private string $host; private int $port; private string $name; public function __construct(string $host, int $port, string $name) { $this->host = $host; $this->port = $port; $this->name = $name; } } 15 строк. Три свойства, которые просто хранят данные. Скроллить такой класс — то еще удовольствие. Ситуация «После» (PHP 8.0+): class DatabaseConfig { public function __construct( private string $host, private int $port, private string $name ) {} } Всего 6 строк. Код говорит только о том, что действительно важно: класс принимает три параметра и хранит их в себе. Никакого визуального шума. Где это особенно вкусно? 1. DTO (Data Transfer Objects) и сущности. Когда вы принимаете данные из формы или API и просто упаковываете их в объект. Раньше на каждый чих нужно было писать блок свойств. Теперь класс DTO выглядит как чистый JSON-структ. 2. Value Objects. Объекты-значения (например, Email, Money, Uuid) становятся невероятно лаконичными. 3. Dependency Injection. Подключаете сервисы через конструктор в Symfony или Laravel? Забудьте про блок свойств. Важные нюансы из реальной мастерской: • Атрибуты. Свойства, созданные через продвижение, отлично работают с атрибутами (аннотациями). Можно смело вешать #[ORM\Column] или #[Assert\NotBlank] прямо над параметром. • Значения по умолчанию. Работают штатно: private string $env = 'prod'. • Продвижение + обычное тело. В одном конструкторе можно совмещать. Часть параметров превратить в свойства, а часть — использовать для сложной логики: public function __construct( private string $apiKey, LoggerInterface $logger ) { $this->logger = $logger; $this->logger->info('Client initialized'); } • readonly. Свойства с продвижением могут быть readonly. Это идеальный тандем для иммутабельных объектов. • Рефакторинг. Если вы переходите со старого легаси, IDE (PHPStorm, VS Code) умеет делать это в один клик (Convert to promoted property). Но всегда проверяйте код-ревью: иногда в теле конструктора остается забытый ручной $this->prop = $prop;. Кстати, это отлично ложится на принцип единственной ответственности. Чем меньше в конструкторе ручной писанины, тем меньше шансов, что вы туда незаметно засунете лишнюю бизнес-логику. Класс становится просто коробкой для данных. А еще это дико ускоряет написание тестов. Мокать конструктор с пятью параметрами, которые просто присваиваются, — одно удовольствие, не нужно настраивать половину сеттеров. Вот так. Идем кодить дальше! 🚀