Vývojáři PHP odmítají v hlasování výčtové typy pro filtrovací rozšíření
Návrh přidat do filtrovacího rozšíření PHP výčtové typy Filter\Filter a Filter\Flag má v hlasování dva hlasy pro a patnáct proti. K přijetí potřebuje dvoutřetinovou většinu a hlasování se zavírá 4. listopadu v jednu hodinu ráno. Hlavní výtka zní, že u dvou příznaků naráz by se stejně muselo sáhnout na celé číslo za výčtem.
Filtrovací rozšíření PHP se ovládá celými čísly. Funkce filter_var() bere jako druhý argument konstantu FILTER_VALIDATE_INT nebo FILTER_VALIDATE_EMAIL, jako třetí pak příznaky typu FILTER_FLAG_ALLOW_HEX. Pod kapotou jsou to obyčejná čísla, takže editor ani statická analýza nepozná, že někdo omylem dosadil příznak na místo filtru. Návrh, o kterém vývojáři PHP právě hlasují, to chtěl spravit dvěma výčtovými typy. Zatím je proti němu patnáct hlasů z devatenácti.

Co návrh přidával
Autorem je Muhammed Arshid KV, stránka návrhu nese datum 3. října 2026 a cílem byla verze PHP 8.7. Rozšíření mělo dostat dva výčtové typy podložené celým číslem: Filter\Filter pro jednotlivé filtry a Filter\Flag pro příznaky. Každá položka výčtu by nesla hodnotu dnešní konstanty, takže by se dalo psát:
filter_var('123', Filter\Filter::VALIDATE_INT, Filter\Flag::ALLOW_OCTAL);
Stávající konstanty měly zůstat beze změny a návrh výslovně uvádí, že žádná existující aplikace by se přepisovat nemusela. Výčty měly být druhá, typovaná cesta k témuž. Implementace leží v pull requestu 24111 v php-src: osm souborů, 605 přidaných řádků, otevřený od 4. října.
U dvou příznaků výčet končí
Slabé místo je vidět přímo v příkladech návrhu. Příznaky se ve filtrovacím rozšíření skládají bitovým součtem a výčtový typ sečíst nejde. Návrh to řeší tím, že se z položky vytáhne její číslo:
filter_var(
'123',
Filter\Filter::VALIDATE_INT,
Filter\Flag::ALLOW_OCTAL->value | Filter\Flag::ALLOW_HEX->value
);
Právě na tohle míří hlavní výtka z diskuze. Tim Düsterhus napsal 9. října, že výčtové typy jsou samy o sobě silně typované hodnoty, a když se kvůli části funkčnosti musí sáhnout na číslo za nimi, typová bezpečnost se tím ruší a z výčtu se v praxi stanou „efektní konstanty“. V druhé zprávě téhož dne to rozvedl: výčet by pomohl jen u filter_var() bez příznaků, u filter_var_array() by nefungoval vůbec a u volání s příznaky by vznikla směs silného výčtu a volného pole voleb.
Düsterhus zároveň upozornil, že přijetí výčtů by mohlo zavřít cestu k řešení, které předá filtr i jeho volby jedním výrazem, tedy zápisu filter_var($foo, Filter\Int(allowOctal: true, allowHex: true)). Ten by potřeboval značkované sjednocení, tedy výčet, jehož položka může nést vlastní hodnoty. Návrh na něj podali Larry Garfield a Ilija Tovilo v prosinci 2020 a dodnes má stav koncept.
Jak se hlasuje
Hlasování otevřel autor 20. října a zavírá se 4. listopadu v 00:00 UTC, tedy v jednu hodinu ráno středoevropského času. Návrh potřebuje dvoutřetinovou většinu.
| Hlas | Počet hlasů | Kdo hlasoval |
|---|---|---|
| Pro | 2 | Marco Pivetta, Daniel Rodrigues Lima |
| Proti | 15 | mezi nimi Larry Garfield, Tim Düsterhus, Nicolas Grekas, Kévin Dunglas a Ilia Alshanetsky |
| Zdrželi se | 2 | vývojáři vystupující jako ashnazg a daniels |
Dvoutřetinová většina se počítá jen z hlasů pro a proti. Při patnácti hlasech proti by tedy musel součet hlasů pro vystoupat na třicet, aby návrh prošel; do uzávěrky by muselo přijít dalších dvacet osm hlasů pro a ani jeden proti. Výsledek zatím není konečný, obrat je ale nepravděpodobný.
Z návrhu na zavržení se stal návrh na výčty
Dnešní podoba je druhá v pořadí. Vlákno v konferenci internals začalo 3. října pod názvem „Deprecate Invalid Filter Options“ a mělo zavést varování pro neplatné hodnoty voleb. Ilija Tovilo k pull requestu připsal hned druhý den, že si není jistý, jestli je dobrý nápad to rozhraní dál rozšiřovat, a poslal autora do konference.
Tam se ozval Derick Rethans s výhradou o patro výš. Filtrovací rozšíření mělo původně předčistit všechna data přicházející do superglobálních polí a odstranění výchozích filtrů ho podle něj ochromilo; než se rozšíření začne modernizovat, mělo by se podle něj vrátit tohle. Autor 7. října návrh přepsal na výčtové typy a 19. října ohlásil, že dvoutýdenní lhůta na diskuzi uplynula. Týmž postupem, tedy diskuzí v konferenci, dvoutýdenní lhůtou a pak hlasováním, prochází i návrh, aby funkce pro převod mezi číselnými soustavami vyhazovaly při neplatném znaku výjimku.
Konstanty zůstávají tak jako tak
Ať hlasování dopadne jakkoli, dosavadní kód se nemění: návrh nic neodebíral ani nepřejmenovával. Zůstane jen rozdíl mezi filtrovacím rozšířením, které se ovládá čísly, a novějšími částmi jazyka, kde se volby předávají objekty a výčty. Mezi hlasy proti je přitom i Larry Garfield, spoluautor návrhu, kterým výčtové typy do PHP 8.1 přišly.
Zdroje
- PHP RFC: Add Filter\Filter and Filter\Flag Enums – znění návrhu, tabulka hlasování a termín uzávěrky, wiki.php.net
- Oznámení o zahájení hlasování z 20. října 2026 – konference php.internals
- Výhrada Tima Düsterhuse k podloženým hodnotám výčtů – php.internals, 9. října 2026
- Druhá zpráva Tima Düsterhuse o značkovaném sjednocení – php.internals, 9. října 2026
- Výhrada Dericka Rethanse k výchozím filtrům – php.internals, 6. října 2026
- ext/filter: Add Filter\Filter and Filter\Flag enums – implementace a komentáře, repozitář php/php-src
- PHP RFC: Tagged Unions – návrh Larryho Garfielda a Iliji Tovila z roku 2020, wiki.php.net