PHP 8.1: Enums (Výčty)

PHP

POZOR! Článek jsem napsal před více jak rokem, a tudíž už nemusí reflektovat můj nynější názor nebo může být zastaralý.

PHP v nadcházející verzi přinese krásnou novinku: výčtový typ. Je to něco, co v PHP dlouho chybělo pro dospělý návrh. Jasný – mohli jsme použít objekt s konstantami, ale nativní implementace a odlišná syntaxe prospěje :)

Jak to v PHP vypadá?

<?php
enum StavPrispevku
{
    case ROZEPSANY;
    case PUBLIKOVANY;
    case NAPLANOVANY;
    case ARCHIVOVANY;
    case ODSTRANENY;
}

$stav = StavPrispevku::ROZEPSANY;

Statické metody ve výčtu

Primárně jsou v jazyku proto, aby nahrazovaly konstruktory (vysloveně business logiku by podle mě výčet mít neměl):

<?php
enum Velikost {
  case S;
  case M;
  case L;
 
  public static function dleDelky(int $cm) {
    return match(true) {
      $cm < 50 => static::S,
      $cm < 100 => static::M,
      default => static::L,
    };
  }
}

Velikost::S == Velikost::dleDelky(20); // TRUE

Konstanty

Výčty mohou obsahovat konstanty:

<?php
enum Velikost {
  case S;
  case M;
  case L;
 
  public const Velke = self::L;
}

Inteface

Výčty mohou implementovat interface:

<?php
interface Delky {
  public function dleDelky(int $cm);
}

enum Velikost implements Delky {
  case S;
  case M;
  case L;
 
  public static function dleDelky(int $cm) {
    return match(true) {
      $cm < 50 => static::S,
      $cm < 100 => static::M,
      default => static::L,
    };
  }
}

Traity

Výčty mohou využívat traity, které se budou chovat stejně jako u tříd – ovšem takové traity nesmí mít vlastnosti (properties), pouze metody:

(Popravdě mě zde nenapadá reálně využití, Vás ano? Poprosím kdyžtak do komentáře :))

<?php
trait Log {
  public function log(string $text): string {
    return "<p>$text</p>";
  }
}

enum Velikost {
  use Log;

  case S;
  case M;
  case L;
}

To bylo takové základní shrnutí. Pro více informací určitě doporučuji přímo RFC: https://wiki.php.net/rfc/enumerations

Znáte někoho, komu by článek mohl pomoct? Zasdílejte mu ho :)

Komentáře