TGViewer
PHP Fart Time PHP Fart Time @php_fart · 1.95K subscribers
Post #48 1.8K
#Article #Типизация #php

Всем нравятся Constructor Property Promotion, не так ли?

final class Foo {
public function __construct(
public bool $bar = false,
public array $baz = [],
) { }
}

☝️ эти фрагменты кода эквивалентны 👇

final class Foo {
public bool $bar;
public array $baz;

public function __construct(
bool $bar = false,
array $baz = [],
) {
$this->bar = $bar;
$this->baz = $baz;
}
}

Но не эквивалентны этому:

final class Foo {
public bool $bar = false;
public array $baz = [];

public function __construct(
bool $bar = false,
array $baz = [],
) {
$this->bar = $bar;
$this->baz = $baz;
}
}

Разница в наличии значений по умолчанию у свойств.

Теперь попробуем создать объекты из обоих вариантов через рефлексию без использования конструктора.
https://3v4l.org/0tLcM

object(Foo)#3 (0) { ["bar"]=> uninitialized(bool) ["baz"]=> uninitialized(array) }
object(Foo)#3 (2) { ["bar"]=> bool(false) ["baz"]=> array(0) { } }

Если у свойства нет значения по умолчанию, то оно будет неинициализированным.

Такой способ создания объектов в обход конструктора широко используется под капотом многих библиотек, не только тех, которые используют doctrine/instantiator.
И иногда это стоит учитывать при работе с классами, которые будут проходить через гидрацию или демаршализацию. У меня такое уже выстреливало 😳.

А если ты счастливый пользователь Cycle ORM, то я рекомендую вообще закрывать конструкторы сущностей (делать пустой приватный конструктор) и вместо этого писать фабрики.
  • 🔥 9
  • 🤔 6
More from @php_fart
  1. Sep 26, 2026Post #387
  2. Sep 26, 2026Testo: тестирование со вкусом хинкали 👤 Алексей Гагарин 🕘 2 октября, 10:00 (МСК) Зачем P…
  3. Sep 24, 2026#ТоксикСреда в четверг. PHPStorm в следующем году будет спонсировать Larabelles*. * Larabe…
  4. Sep 9, 2026Попрошу перенести старт на конец сентября этого года. Лишь бы не жрать лимон 🍋
  5. Sep 9, 2026Если по моему промокоду придёт 50 фартанов, то я сожру лимон в прямом эфире перед докладом…
  6. Sep 9, 2026А у меня для вас вот такой промокод на Пыхник: PHPFART-26. Приходите смотреть, как я облаж…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →