<?php abstract class Bits { protected $bits = 0; public function __construct($bits = NULL) { if ($bits !== NULL) $this->bits = $bits; } public function has(int $bit): bool { return ($this->bits & $bit) === $bit; } public function set(int $bit, bool $bool) { if ($bool) $this->bits |= $bit; else $this->bits &=~ $bit; return $this; } public function get(): int { return $this->bits; } }
class.Flags.php
class Flags extends Bits { const _BAN_ = 1; const _ONLINE_ = 2; const _GLOBALS_ = 4; const _ECHO_ = 8; const _SPY_ = 16; }
Klasa jak widać prosta, zainspirowałem się do zrobienia jej po artykule nospor-a.
(Dwuwartościowe przechowywanie)
Oceniać można wszystko (nazewnictwo, co można by lepiej) itp.
Przykłady użycia:
Rejestracja Użytkownika
$flags = new Flags; $flags->set(Flags::_GLOBALS_, true); # ... Potem przy insercie do bazy użyjemy dla pola `options` $flags->get();
Gdy już mamy zarejestrowanego a chcemy np. Zaktualizować status online/spy:
$flags = new Flags($user['options']); $flags ->set(Flags::_ONLINE_, true) ->set(Flags::_SPY_, true); # przy update do bazy.... $flags->get();
Aby sprawdzić czy uzytkownik jest zalogowany:
$flags = new Flags($user['options']); #... if ($flags->has(Flags::_ONLINE_)) { # online } else { # offline }
Oczywiście klasę Flags trzeba dopasować pod swoje wymagania.
@edit. Zmiana nazw klas na duże.