Přeskočit na obsah
Tech-Blog Chatujme.cz Chatujme.cz
Programování

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.

· 0 zhlédnutí

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.

Zdrojový kód v PHP otevřený v editoru
Zdrojový kód v PHP otevřený v editoru. Foto: Ron23545, Wikimedia Commons (CC BY-SA 4.0)

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.

HlasPočet hlasůKdo hlasoval
Pro2Marco Pivetta, Daniel Rodrigues Lima
Proti15mezi nimi Larry Garfield, Tim Düsterhus, Nicolas Grekas, Kévin Dunglas a Ilia Alshanetsky
Zdrželi se2vý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

Programování

PHP

← zpět na výpis