Кейс: нужно хранить N булевых опций в одном поле, не раздувая таблицу. Решение: кладём все флаги в одно 32/64-битное число, где каждый бит = отдельная опция (маска). `enum FooFlag: int { case Activated = 1 << 0; // 0b0001 case Visible = 1 << 1; // 0b0010 case Archived = 1 << 2; // 0b0100 case Locked = 1 << 3; // 0b1000 }

final class Foo { private int $mask = 0;

/* ---------- 1-строчные сеттеры ---------- */ public function setFlag(FooFlag $flag, bool $on = true): self { $this->mask = $on ? $this->mask | $flag->value // ставим бит : $this->mask & ~$flag->value; // снимаем бит

return $this; }

/* ---------- 1-строчные геттеры ---------- */ public function hasFlag(FooFlag $flag): bool { return ($this->mask & $flag->value) !== 0; }

/* ---------- Синтаксический сахар ---------- */ public function activate(): self { return $this->setFlag(FooFlag::Activated, true); } public function deactivate(): self { return $this->setFlag(FooFlag::Activated, false); } public function isActivated(): bool { return $this->hasFlag(FooFlag::Activated); }

/* ---------- Для БД ---------- */ public function getMask(): int { return $this->mask; } public function setMask(int $mask): void { $this->mask = $mask; } }`