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 :)