Výčty dostávají v PHP 8.6 dvě drobnosti: vestavěný výčet SortDirection a možnost implementovat __debugInfo().
Když jsem tu psal o výčtech v PHP 8.1, byly úplnou novinkou. Za těch pár let se z nich stala běžná součást kódu a teď se k nim přidává pár maličkostí.
Co umí SortDirection?
Směr řazení si dneska řeší každý framework po svém. Někdo řetězci ‚ASC‘ a ‚DESC‘, někdo konstantami, někdo booleanem. PHP 8.6 přidává jeden společný výčet do globálního jmenného prostoru:
<?php
enum SortDirection
{
case Ascending;
case Descending;
}
Použití pak vypadá takhle:
<?php
$dotaz->seradit('vytvoreno', SortDirection::Descending);
Všimněte si, že výčet není zálohovaný (backed). Autoři to zdůvodnili tím, že neexistuje jedna zjevná kanonická podoba, protože někdo potřebuje ‚ASC‘, někdo 1 a -1 a někdo true a false. Převod si tedy udělá každý sám:
<?php
function smerDoSql(SortDirection $smer): string
{
return match ($smer) {
SortDirection::Ascending => 'ASC',
SortDirection::Descending => 'DESC',
};
}
Do budoucna se počítá s tím, že ho začnou přijímat i funkce ze standardní knihovny, v RFC se zmiňuje třeba druhý parametr scandir(). To už ale nepotřebuje samostatné RFC, jde jen o rozšíření typu parametru.
Proč se __debugInfo() dostalo do výčtů?
Původní RFC o výčtech zakázalo skoro všechny magické metody, povolené zůstaly jen __call(), __callStatic() a __invoke(). Důvod byl rozumný, většina magických metod pracuje se stavem a výčet žádný stav nemá.
Jenže __debugInfo() se stavem nepracuje, takže pro ni PHP 8.6 dělá výjimku:
<?php
enum StavObjednavky: string
{
case Nova = 'nova';
case Zaplacena = 'zaplacena';
case Odeslana = 'odeslana';
public function __debugInfo(): array
{
return [__CLASS__ . '::' . $this->name . ' = ' . $this->value];
}
}
var_dump(StavObjednavky::Zaplacena);
Bez toho vám var_dump() vypíše případ ve výchozím formátu, se kterým nic nenaděláte. U ladicích výpisů v testech se to hodí.
První RFC prošlo v poměru 22 : 2, druhé 16 : 2 (5 se zdrželo). Obojí odstraňuje drobné tření, které tam bylo zbytečně.
Zdroje: https://wiki.php.net/rfc/sort_direction_enum a https://wiki.php.net/rfc/debugable-enums