Latte 2.9 s podporou nových features PHP 8
- David Grudl
- Nette Core | 8218
Současné verze Latte by měly fungovat pod PHP 8. Nicméně Osmička přinesla nějaké novinky, které bych chtěl sladit s Latte v chystané verzi 2.9.
Optional chaining
PHP 8 přišlo s volitelným řetězením, což jsem do Latte implementoval před rokem. Upřímně, kdybych věděl, že se to stane, tak se s tím nemrd…neprogramuju :-) Naštěstí používáme úplně stejnou syntax, stejný princip, obojí je kompatibilní.
Latte navíc umožňuje použít otazník i ve dvou případech, kdy PHP
8 ne. Staticky $obj?::$pro
a na konci výrazu $var?
.
Rozhodl jsem se, že tyto případy deprecatnu i v Latte 2.9. Jednak jsem je
nedokumentoval a nemyslím, že je někdo stihl použít (druhý případ se dá
snadno nahradit za $var?? null
). Tím bude syntax sjednocena a pod
PHP 8 se může používat nativně bez překladu pomocí Latte.
Named arguments
Latte 2.9 přidá podporu pro pojmenované argumenty. Jednak jako alternativu u značek jako:
{include file.latte arg1 => 1, arg2 => 2} --> {include file.latte arg1: 1, arg2: 2}
{link default page => 1} --> {link default page: 1}
A dále uvnitř jakýchkoliv funkcí a metod
{func(a: 10, b: 20)}
, ale to bude fungovat jen pod PHP 8.
Komplikovanější je to v případě modifikátorů, protože tam má
dvojtečka stejnou funkci jako čárka (z důvodu prahistorické kompatibility
se Smarty), takže {$x|filtr: a: 2}
je totéž co
{$x|filtr: a, 2}
.
Mám za to, že dvojtečka jako oddělovač se používá jen minimálně, a
stálo by za to ji postupně nahradit za pojmenované argumenty, protože ty se
u modifikátorů můžou krásně hodit. Takže bych chtěl v Latte
2.9 přidat deprecated hlášku všude tam, kde se dá zápis chápat i jako
použití pojmenovaného argumentu, aby se v budoucnu mohlo na ně přejít.
Tj. {$x|filtr:$a:$b}
je v pohodě, tam není kolize.
match expression
Match expression je alternativa switch statement, která opravuje jeho dva zásadní problémy:
- používá striktní porovnávání
===
- nevyžaduje psát
break
Latte má značky {switch} a {case},
které ale tyhle dvě věci opravují taky. Tudíž vlastně fungují téměř
jako match
a asi není dál co řešit. Snad jen, že by
{case}
mohl podporovat víc hodnot oddělených čárkou.