Přehled novinek v PHP 8.4: property hooks, HTML5 selektory a nové funkce

Nová verze PHP vyšla před pár dny a přináší celou řadu zajímavých novinek. Podíváme se na ty nejzajímavější a ukážeme si kousky kódu, které možná pomohou vašim projektům nebo vám ušetří čas při psaní kódu.

První verze PHP vyšla v červnu 1995. Od té doby urazila kus cesty a v zdokonalování samozřejmě pokračuje i nejnovější vydání PHP 8.4.1. Počkat, ptáte se, kam zmizelo vydání 8.4.0?

Pozorným očím to samozřejmě neuniklo, ale řada vývojářů není až tak pozorná, aby si důkladně pročetla poznámky k vydání a mailingové listy s oznámením nové verze. Tedy PHP 8.4.0 neobsahovalo některé bezpečnostní aktualizace a tak první oficiální stabilní verzí nové řady PHP je 8.4.1. Více viz začátek zprávy na php.internals.

Nejvýznamnějšími novinkami PHP 8.4 jsou:

  • Hákování změn vlastností
  • Asymetrické nastavení viditelnosti
  • Líné objekty
  • Podtřídy pro PDO ovladače
  • Objekt typu BCMath
  • HTML5 v DOM
  • A řada dalšího

Taky vám přijde český překlad tak obtížný? Popravdě, měl jsem problém to česky popsat a kdybych si četl už jen o líných objektech, asi bych musel hodně přemýšlet, o co jde. Tak s dovolením budu pokračovat v podrobnějším popisu s anglickým názvoslovím.

Image
Novinky v PHP 8.4, ilustrační obrázek

Property hooks

Při nastavování objektů lze počínaje PHP 8.4 využít napojení dalšího kódu poslouchajícího na set a get. Díky tomu lze reagovat na situace, kdy nastavujete nějakou vlastnost a třeba vyhodit chybu v případě, že cílová hodnota není podle potřeby. Dříve bylo nutné v __construct() nachystat nastavení proměnných a pak připravit settery a gettery. Celý proces je nyní jednodušší.

<?php

class Student

{

    public string $celeJmeno {

        get => $this->jmeno . ' ' . $this->prijmeni;

    }

    public string $jmeno {

        set => ucfirst(strtolower($value));

    }

    public string $prijmeni {

        set {

            if (strlen($value) < 2) {

                throw new \InvalidArgumentException('Příjmení je příliš krátké');

            }

            $this->prijmeni = $value;

        }

    }

}


$p = new Student();

$p->jmeno = 'hOnZa';

print $p->jmeno; // Zobrazí Honza

$p->prijmeni = 'Polzer';

print $p->celeJmeno; // Zobrazí Honza Polzer

Výše uvedený kód nastavuje vlastnosti jméno a příjmení objektu student a volá vlastnost celeJmeno. Všimněte si, že pro nastavení jména je aplikováno zpracování na malá písmena a nastavení prvního písmenka jako velkého. U nastavení příjmení se zase před nastavením kontroluje jeho délka.

Vlastnost celeJmeno je virtuální, protože není nikde nastavena, nicméně s doplněním get může i tak vracet nějakou hodnotu, v tomto případě jméno a příjmení.

Asymmetric Property Visibility

Za možná poněkud komplikovaným názvem novinky v PHP 8.4 stojí možnost nastavit viditelnost public / protected jinak pro čtení a jinak pro zápis. První je uvedena viditelnost pro čtení vlastnosti a jako druhá pro její nastavení:

<?php

class Student

{

    public protected(set) string $jmeno;

    public function __construct(string $jmeno)

    {

        $this->jmeno = $jmeno;

    }

}

Lazy Objects

Líné objekty využijete v PHP 8.4 k tomu, že jejich inicializaci odložíte až do chvíle, kdy se k nim bude přistupovat. Pravděpodobně se s tím setkáte u různých frameworků, které načítají vlastnosti objektů například z databáze. Podrobnější ukázky najdete v dokumentaci k líným objektům.

Nový atribut #[\Deprecated]

Pro označování zastaralých kusů kódu je možné použít nový atribut, ve kterém lze definovat chybovou hlášku a také verzi PHP, od které bude například metoda zastaralá. Namísto dosavadního E_DEPRECATED z PHP samotného způsobí tento atribut chybový kód E_USER_DEPRECATED.

Níže uvedený kód zobrazí chybové hlášení Deprecated: Method Student::getJmeno() is deprecated since 8.4, use Student::getName(). Tedy za předpokladu, že nemáte chybové hlášky potlačeny.

<?php

error_reporting( E_ALL );

class Student

{

    #[\Deprecated(

        message: "use Student::getName() instead",

        since: "8.4",

    )]

    public function getJmeno(){

      return 'Honza';

    }

    public function getName(){

        return 'Honza';

      }
}

$student = new Student();

echo $student->getJmeno();

HTML5 selektory v DOM

Tahle novinka je má oblíbená. PHP 8.4 totiž podporuje parsování DOM z HTML dokumentu pomocí selektorů z HTML5. Nouzové importy obsahu z vyrenderovaných stránek v situacích, kdy klienti nejsou schopni dodat data z webu ve strojové podobě, tak bude opět o něco jednodušší i bez použití frameworků a knihoven.

<?php

$dom = Dom\HTMLDocument::createFromString(

    <<<HTML

        <nav>

            <ul>

                <li><a href="#">Domů</a></li>

                <li><a href="#">Produkty</a></li>

                <li><a href="#">O nás</a></li>

                <li><a href="#">Kontakt</a></li>

            </ul>

        </nav>

        HTML,

    LIBXML_NOERROR,

);

$posledni = $dom->querySelector('nav > ul li:last-child');

Letem světem PHP 8.4

S pomocí BCMath\Number zpřístupníte práci s čísly coby objekty. Momentálně mě nenapadá žádný pěkný příklad. Zajímavější mi přijde sada nových funkcí pro práci s polem: array_find(), array_find_key(), array_any() a array_all().

Podtřídy PDO objektů vracejí podrobnější informaci o typu připojení k databázi. Konkrétně Pdo\Sqlite, Pdo\MySql, Pdo\Odbc a další.

Zjednodušuje se zápis volání vlastností a metod nově inicializovaných objektů bez toho, že by výraz new musel být celý v závorce. Nyní vám tedy stačí new Student()->getVysledky().

Pro češtinu by mohla být zajímavá nová sada multibyte funkcí mb_trim(), mb_ltrim(), mb_rtrim(), mb_ucfirst() a mb_lcfirst().

Zpracováváte-li XML, pak zřejmě využijete rychlé sestavení pomocí metod XMLReader::fromStream(), XMLReader::fromUri(), XMLReader::fromString(). Podobně mají i metody toNeco().

Přibyla celá řada novinek v používání cURL. Zkuste si zavolat curl_version(), vrátí asociativní pole se všemi vlastnostmi cURL s informací, zda jsou podporovány.

Nová implementace JIT slibuje lepší výkon. Pozor, standardně je vypnutá. Podrobnosti například zde.

Co v PHP 8.4 končí?

Nastal čas rozloučit se s několika funkcemi a konstantami. Z těch zajímavějších:

  • E_STRICT je nyní deprecated
  • Stejně tak použití _ coby názvu třídy je zastaralé
  • Rozšíření IMAP, OCI8, PDO_OCI a pspell byly přesunuty do PECL
  • Špatný režim zaokrouhlování v round() vyvolá chybu ValueError

PHP 8.4 na hostingu a v CMS

Z českých hostingů jsem si jako prvního s podporou PHP 8.4 všiml mého oblíbeného Websupportu a hned novou verzi úspěšně vyzkoušel. Podle dřívějšího vyjádření by jej měl umět i WP Hosting, zde jsem ale nezkoušel. Předpokládám, že postupně podpora nové verze začne nabíhat všude.

Další informace najdete v přehledech New features a PHP 8.4 Released.

Tagy

Buďme ve spojení, přihlaste se k newsletteru

Odesláním formuláře souhlasíte s podmínkami zpracováním osobních údajů. 
Více informací v Ochrana osobních údajů.

Autor článku: Jan Polzer

Tvůrce webů z Brna se specializací na Drupal, WordPress a Symfony. Acquia Certified Developer & Site Builder. Autor několika knih o Drupalu.
Web Development Director v Lesensky.cz. Ve volných chvílích podnikám výlety na souši i po vodě. Více se dozvíte na polzer.cz a mém LinkedIn profilu.

Komentáře k článku

Přidat komentář

Odesláním komentáře souhlasíte s podmínkami Ochrany osobních údajů

reklama
Moje kniha o CMS Drupal

 

Kniha 333 tipů a triků pro Drupal 9


Více na KnihyPolzer.cz