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.

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] a #[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() a 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(), SortDirection a grapheme_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() a __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.