PHP

PHP 8.6: Novinky u výčtů

// obsah 2
  1. 01 Co umí SortDirection?
  2. 02 Proč se __debugInfo() dostalo do výčtů?

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

Michal Katuščák
Michal Katuščák

Navrhuji a vyvíjím aplikace nad Symfony a Reactem, zajímám se architekturu softwaru. Žiju v Českých Budějovicích.