Programování

PHP 8.6 dostalo částečnou aplikaci funkcí, zatím je jen ve třetí alfě

Vývojáři PHP vydali 30. července třetí alfu verze 8.6. Je v ní částečná aplikace funkcí: když se místo argumentu napíše otazník, funkce se nezavolá, ale vznikne closure, které na chybějící argument čeká. Ostrá verze je v plánu na 19. listopadu.

· 5 zhlédnutí

Modrá figurka slona elePHPant
Figurka slona elePHPant, maskota PHP. Foto: Atomic Taco from Seattle, WA, USA, Wikimedia Commons (CC BY-SA 2.0)

Vývojový tým PHP oznámil 30. července třetí alfu verze 8.6. Alfa je předběžné vydání pro zkoušení, oznámení u ní výslovně varuje, že do ostrého provozu nepatří. Zajímavá je tím, co se do ní dostalo: částečná aplikace funkcí, jejíž menší verzí byl zkrácený zápis odkazu na funkci z PHP 8.1.

Otazník místo argumentu

Částečná aplikace znamená, že se funkce zavolá jen s částí argumentů a zbytek se doplní později. Nový zápis to dělá dvěma značkami: otazník zastupuje právě jeden argument a tři tečky zbytek. Když je PHP ve volání najde, funkci nezavolá, ale vyrobí closure (anonymní funkci), jehož parametry odpovídají tomu, co zůstalo nedoplněné.

function stuff(int $i, string $s, float $f): string {}

// closure, které čeká jen na $s
$c = stuff(1, ?, 3.14);

// closure, které čeká na $s i $f
$d = stuff(1, ...);

Praktický smysl to má u zpětných volání. Návrh RFC to ukazuje na array_map(): místo anonymní funkce, ve které se musí ručně zopakovat všechny parametry i typy, se napíše volání s otazníkem na místě, kam přijde položka pole.

$result = array_map(str_replace('hello', 'hi', ?), $arr);

Co closure podědí z původní funkce

Z původní funkce se do vzniklého closure přenese jméno parametru, jeho typ, volitelnost, výchozí hodnota i to, jestli se předává odkazem. Z atributů ale jen dva: #[NoDiscard]#[SensitiveParameter]. Návrh to zdůvodňuje tím, že oba mají přímý dopad za běhu, kdežto #[Deprecated] by ohlásil zastaralost dvakrát místo jednou a #[Override] na closure nedává smysl. U vlastních atributů PHP neví, jestli je kopírovat, takže je zahazuje.

Tím se nový zápis liší od zkráceného odkazu na funkci, který přidalo PHP 8.1 pod názvem first-class callable syntax. Ten si atributy nechává všechny, protože mezilehlé closure vůbec nevytváří, jen na funkci odkazuje. Návrh sám ho popisuje jako degenerovaný případ částečné aplikace: foo(...) je zápis, ve kterém se nedoplňuje nic.

V dodatku k návrhu stojí ještě jedna věc, kterou samotný text původně neuváděl. Closure dědí rozsah, ve kterém vzniklo, stejně jako každé jiné. Částečně použít se proto dá i soukromá metoda a výsledek se pak dá předat ven z třídy.

Od hlasování do alfy uplynulo necelých osm měsíců

Návrh nese jméno Partial Function Application (v2), podepsaní jsou pod ním Larry Garfield a Arnaud Le Blanc a je datovaný 3. června 2025. Je to druhý pokus: podle vlastních slov je v podstatě shodný s dřívějším návrhem téhož jména a zkrácený odkaz na funkci z PHP 8.1 z něj tehdy vznikl jako menší první krok.

Ke schválení bylo potřeba dvoutřetinové většiny; konec hlasování měl podle návrhu připadnout na 5. prosince 2025 ve 12 hodin světového času a dnes je uzavřené. Stav návrhu je dnes uvedený jako implementovaný a odkazuje na dva sloučené commity s poznámkou, že jsou v alfě 3. Mezi koncem hlasování a vydáním, ve kterém si zápis může někdo poprvé vyzkoušet, je tedy necelých osm měsíců.

Co dalšího do alfy přibylo

Poznámky k přechodu v souboru UPGRADING vypisují u 8.6 i řadu drobností. Funkce clamp() vrátí hodnotu, pokud je v zadaném rozsahu, a jinak nejbližší mez. Přibyl výčtový typ SortDirection, funkce grapheme_strrev() v rozšíření intl, ReflectionParameter::getDocComment()mysqli::quote_string(). Větší kusy jsou tři: rozhraní pro polling, tedy dotazování na připravenost vstupu a výstupu (jmenný prostor Io\Poll), obnovení relace TLS u proudů a nové rozhraní pro chyby proudů. Opcache umí nově překlad za běhu i pro vláknově bezpečná sestavení (ZTS) na procesorech Apple Silicon.

Nezávislý přehled novinek na PHP.Watch u verze 8.6 uvádí tutéž alfu 3 a ze zmíněných věcí jmenuje clamp(), SortDirectiongrapheme_strrev().

Co se naopak ruší

Za zastaralé je nově označené celé mbregex, tedy regulární výrazy v rozšíření mbstring (funkce mb_ereg a další). Důvod je v samostatném návrhu: knihovna Oniguruma, na které rozšíření stojí, se už neudržuje. Zastarání samo nic nerozbije, program jen začne hlásit varování; je to ale upozornění dopředu pro každého, kdo tyhle funkce v kódu má.

Zastaralé je taky vracení hodnoty z __construct()__destruct() a jejich psaní jako generátoru. Adresa php://filter s víc než šestnácti filtry hlásí varování, dokud se počet nenastaví výslovně. Ze změn, které nejsou zpětně slučitelné, jsou podstatné dvě: preg_grep() při chybě knihovny PCRE vrátí false místo částečného pole a vlastnosti rozšíření DOM, které byly dosud v dokumentaci označené jen ke čtení, jsou nově deklarované s asymetrickou viditelností, takže zápis zvenčí hlásí jinou chybu než dřív.

Beta 13. srpna, ostrá verze v listopadu

Plán vydání je rozepsaný do 19. listopadu 2026, kdy má vyjít ostrá verze. Do 11. srpna mají být sloučené všechny návrhy mířící na 8.6, 13. srpna přijde beta 1 a s ní měkké zmrazení novinek, u kterého už musí být hlasování uzavřená. Tvrdé zmrazení je na 22. září, první kandidát na vydání o dva dny později. Vydání řídí trojice: Daniel Scherzer jako veterán, Matteo Beccati a Joe Ferguson jako nováčci.

Pro toho, kdo píše knihovny, je alfa první příležitost, jak narazit na problém dřív, než se verze uzavře. Otazník ve volání navíc není povinnost: kdo ho psát nechce, píše anonymní funkce jako dosud a nic se mu nerozbije. Změní se podle nás spíš zvyk – tam, kde se dnes opisuje celá hlavička funkce kvůli jednomu argumentu, bude stačit jeden znak.

Programování

PHP

Diskuse

Zatím tu nikdo nediskutuje.

Diskutovat mohou přihlášení čtenáři – přihlaste se nebo si založte účet.

← zpět na výpis