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.
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.
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.
Přidat komentář