Co přinese PHP 7.4?

PHP

POZOR! Článek jsem napsal před více jak rokem, a tudíž už nemusí reflektovat můj nynější názor nebo může být zastaralý.

Pokud PHP dodrží svůj cyklus vydání, čeká nás PHP 7.4 začátkem prosince tohohle roku. Byl jsem zvědavý, co nového nás čeká a mrknul jsem se na stránku wiki.php.net/rfc#php_74, kde je souhrn již implementovaných úprav.

FFI – Foreign Function Interface (RFC)

FFI je nové rozšíření pro PHP, které umožní používat funkce, knihovny a proměnné z jazyka C, stejně jako to umožňuje LuaJit a Python. Má to přinést především možnost psaní rozšíření PHP v PHP samotném.

Příklad použití funkce printf() z C knihovny libc.so.6 (zdroj: RFC):

<?php
// create FFI object, loading libc and exporting function printf()
$ffi = FFI::cdef(
    "int printf(const char *format, ...);", // this is regular C declaration
    "libc.so.6");
// call C printf()
$ffi->printf("Hello %s!\n", "world");

Typed properties (RFC)

Konečně! Na tohle jsem čekal od verze 7.0. Hodně užitečná úprava, díky který můžeme určovat typ vlastností v třídě. Tím se zbavíme nejčastějšího PHPDoc komentáře /** @var int $vlastnost */. Už mi bude chybět jen (v ohledu typování) určováni typu proměnných ve funkci / metodě.

Příklad (zdroj: RFC):

<php declare(strict_types=1);

class User {
    public int $id;
    public ?string $name;
 
    public function __construct(int $id, ?string $name = null) {
        $this->id = $id;
        $this->name = $name;
    }
}

Null Coalescing Assignment Operator (RFC)

Další výborná úprava, umožňující přiřazení hodnoty, pokud její aktuální je null.

// PHP < 7.4
$data['user_id'] = $data['user_id'] ?? 'value';

// PHP >= 7.4
$data['user_id'] ??= 'value';

Preloading (RFC)

Tato úprava se týka rozšíření opcache a díky ní lze na vyžádání zkompilovat soubory na první požadavek a následně je uloží do sdílené paměti a další HTTP požadavky už ji rovnou použijí.

Soubory se jednou zkompilují (na první požadavek) a poté jsou uloženy ve sdílené paměti. Všechny následující požadavky HTTP používají reprezentaci uloženou ve sdílené paměti. Tím se značné zvýší výkon.

Nese to sebou pár ale. Logicky, když dojde k úpravě PHP třídy, která je zkompilovaná na souborovém systému na serveru, tak bude potřeba server restartovat. Dále, když budete na jednom serveru hostovat více aplikací, které použijí třídu se stejným názvem, ale jiným kódem, bude zkompilovaná pouze ta, kterou si server požadavkem vyžádal jako první. To je pochopitelně problém. V jiných případech má při použití dojít k 30% – 50% zrychlení. Bude se to hodit například u částí frameworků.

Příklad (zdroj: RFC):

<?php
function _preload($preload, string $pattern = "/\.php$/", array $ignore = []) {
  if (is_array($preload)) {
    foreach ($preload as $path) {
      _preload($path, $pattern, $ignore);
    }
  } else if (is_string($preload)) {
    $path = $preload;
    if (!in_array($path, $ignore)) {
      if (is_dir($path)) {
        if ($dh = opendir($path)) {
          while (($file = readdir($dh)) !== false) {
            if ($file !== "." && $file !== "..") {
              _preload($path . "/" . $file, $pattern, $ignore);
            }
          }
          closedir($dh);
        }
      } else if (is_file($path) && preg_match($pattern, $path)) {
        if (!opcache_compile_file($path)) {
          trigger_error("Preloading Failed", E_USER_ERROR);
        }
      }
    }
  }
}
 
set_include_path(get_include_path() . PATH_SEPARATOR . realpath("/var/www/ZendFramework/library"));
_preload(["/var/www/ZendFramework/library"]);

Pozor, funkce opcache_reset() neodstraní zkompilované třídy, vždy je nutné restartovat server, aby se její změna projevila.

Always available hash extension (RFC)

I z této změny mám radost, protože rozšíření hash bude dostupné vždy (stejně jako rozšíření date nebo spl). Zde není, co víc dodat :)

Password Hashing Registry (RFC)

Vznikla nová funkce password_algos() vracející pole dostupných hashovacích algoritmů. Důvodem bylo to, že ve funkcích password_* nejsou vždy všechny dostupný. Záleží na knihovnách (konkrétně tedy na libargon), se kterými je PHP na daném stroji zkompilováno.

Příklad (zdroj: RFC):

print_r(password_algos());
/*
  Array (
      [0] => "2y" // Ident for "bcrypt"
      [1] => "argon2i"
      [2] => "argon2id"
  )
*/

Improve openssl_random_pseudo_bytes() (RFC)

Zjednodušeně řečeno: Funkce openssl_random_pseudo_bytes() při chybě vracela false, nově dojde k vyhození výjimky. To schytalo částečně i kritiku, protože setinková (minoritní) verze by měla být zpětně kompatibilní a zde tomu tak není. Nejlépe to vysvětlí pull-request, který úpravu v PHP provádí: github.com/php/php-src/pull/3649. Docela mne pobavil komentář od Majkl578 „Quite disgusting BC break for minor version (7.4)…“ [Docela nechutný BC break pro minoritní verzi (7.4) …]. Rovněž ale s touto úpravou nesouhlasím.

Jak se těšíte na novou verzi vy? :)

Znáte někoho, komu by článek mohl pomoct? Zasdílejte mu ho :)

Komentáře