Latte 2.9 s podporou nových features PHP 8

David Grudl
Nette Core | 8129
+
+8
-

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.