*/ private array $idToEnum = []; /** * @var int[] * @phpstan-var array */ private array $enumToId = []; public function __construct(){ foreach(GameMode::cases() as $case){ $this->register(match($case){ GameMode::SURVIVAL => 0, GameMode::CREATIVE => 1, GameMode::ADVENTURE => 2, GameMode::SPECTATOR => 3, }, $case); } } private function register(int $id, GameMode $type) : void{ $this->idToEnum[$id] = $type; $this->enumToId[spl_object_id($type)] = $id; } public function fromId(int $id) : ?GameMode{ return $this->idToEnum[$id] ?? null; } public function toId(GameMode $type) : int{ $k = spl_object_id($type); if(!array_key_exists($k, $this->enumToId)){ throw new \InvalidArgumentException("Game mode $type->name does not have a mapped ID"); //this should never happen } return $this->enumToId[$k]; } }