php 8

PHP 8 Novinky – 1. časť

PHP 8 bude vydané 26. novembra 2020. Táto veria bude hlavná, preto prináša veľa nových funkcií a zlepšení výkonu. Zmien a noviniek je tak veľa, že som sa rozhodol zoznam tých najzaujímavejšich vecí rozdeliť na dve časti.

PHP 8 na serveroch speedweb-u

Na verziu php 8 sa veľmi tešíme a preto ju po otestovaní nasadíme v čo najkratšej dobe. Pre zmenu PHP verzie bude stačiť navštíviť našu administráciu a prepnúť si verziu php v nastaveniach. Zmena php verzie

Novinky

Zoznam noviniek neobsahuje úplne všetky zmeny, ale len najzaujímavejšie novinky.

Union types

Možnosť typovať viacero typov v definícií funkcie. Union typy je kolekcia dvoch a viacero typov, ktoré naznačujú, že je možné použiť jeden z nich.

public function foo(Foo|Bar $input): int|float;

Treba mať na pamäti, že void nikdy nemôže byť súčasťou union typu, pretože znamená „vôbec žiadna návratová hodnota“. Ďalej môžu byť nulové zväzy písané pomocou | null alebo pomocou existujúceho ? napríklad:

public function foo(Foo|null $foo): void;

public function bar(?Bar $bar): void;

JIT

Kompilátor JIT – just in time – sľubuje významné vylepšenia výkonu, aj keď nie vždy v kontexte webových požiadaviek.

Ako to funguje JIT?

Kompilator JIT si skompiluje časti kódu za behu a tieto skompilované časti použije namiesto realneho kódu. Je to v podstate ako cache interpretovaného kódu.

Existuje takzvaný „monitor“, ktorý sa bude pozerať na bežiaci kód. Keď tento monitor zistí časti vášho kódu, ktoré sa znovu vykonávajú, označí ich ako „warm“ alebo „hot“, v závislosti od frekvencie.

Tieto ‚hot‘ časti je možné skompilovať ako optimalizovaný strojový kód a použiť ich za chodu namiesto skutočného kódu.

Nevýhody JIT

JIT generuje skompilovaný kód v strojovom jazyku. Preto aj chyby, ktoré vzniknu počas behu tohto kódu sú v strojovom jazyku. Existuje tool na debug takéhoto kódu, ale vzrastá náročnosť na riešenie prípadných bugov a chýb, ktoré vzniknú.

The nullsafe operator

Ak ste oboznámení s operátorom nulového spájania, už ste oboznámení s jeho nedostatkami: nefunguje na volaniach metód. Namiesto toho potrebujete priebežné kontroly alebo sa spoľahnite na voliteľných pomocníkov poskytovaných niektorými rámcami:

$startDate = $booking->getStartDate();

$dateAsString = $startDate ? $startDate->asDateTimeString() : null;

S pridaním operátora nullsafe teraz môžeme mať pri metódach null priradenie podobné zlučovaniu.

$dateAsString = $booking->getStartDate()?->asDateTimeString();

Named arguments – Pomenované argumenty

Pomenované argumenty vám umožňujú odovzdať hodnoty funkcii zadaním názvu hodnoty, aby ste nemuseli brať ohľad na ich poradie a môžete tiež preskočiť voliteľné parametre.

function foo(string $a, string $b, ?string $c = null, ?string $d = null) 
{ /* … */ }

foo(
    b: 'value b', 
    a: 'value a', 
    d: 'value d',
);

Takto pomenované argumenty nám môžu ušetriť zbytočné zadávanie nepovinnej alebo nullovej hodnoty. Napríklad ak si definujeme hodnotu session:

setcookie(
    name: 'test',
    expires: time() + 60 * 60 * 2,
);

Deklarácia funkcie setcookie pritom vyzerá takto:
setcookie ( 
    string $name, 
    string $value = "", 
    int $expires = 0, 
    string $path = "", 
    string $domain = "", 
    bool $secure = false, 
    bool $httponly = false,
) : bool

Pomenované argumenty je možné kombinovať s nepomenovanými argumentmi, ktoré sa tiež nazývajú usporiadané. V takom prípade musia byť zoradené argumenty vždy na prvom mieste. Napríklad:

class Customer
{
    public function __construct(
        public string $name,
        public string $email,
        public int $age,
    ) {}
}

Vytvorenie objektu:

$customer = new Customer(
    $input['name'],
    age: $input['age'],
    email: $input['email'],
);

Podla poradia sme najskôr vložili nepomenovaný atribút, čo je v poriadku. Ak však zadáme pomenovaný atribút:

$customer = new Customer(
    age: $input['age'],
    $input['name'],
    email: $input['email'],
);

Vrati nám vytvorenie objektu exception.

Ďalšie zaujimavé použitie je pomocou polí.

$input = [
    'age' => 25,
    'name' => 'Homer',
    'email' => 'dev@speedweb.sk',
];

$customer = new Customer(...$input);

Attributes

Atribúty, všeobecne známe ako anotácie v iných jazykoch, ponúkajú spôsob pridávania metaúdajov do tried bez nutnosti analyzovať phpdoc blok.

Match

Ak potrebujete porovnávať hodnoty vracať premenné podľa zhody môžete použiť SWITCH. Php 8 nám však ponúka elegantnejšie riešenie porovnávania bez nutnosti používania break-u.

Pôvodny zápis s použitím switch:

switch ($statusCode) {
    case 200:
    case 300:
        $message = null;
        break;
    case 400:
        $message = 'not found';
        break;
    case 500:
        $message = 'server error';
        break;
    default:
        $message = 'unknown status code';
        break;
}

Rovnaký zápis použitím match

$message = match ($statusCode) {
    200, 300 => null,
    400 => 'not found',
    500 => 'server error',
    default => 'unknown status code',
};

Treba však pamätať na to, že match striktne kontroluje aj typovosť. Ak máme napríklad integer 123 a string „123“, tak sa dané hodnoty nezhodujú.

Constructor property promotion

Umožňuje definovať premenné objektu v konštruktore. Určuje tak vlastnosti objektu v konštruktore.

Pôvodný zápis:

class Money 
{
    public Currency $currency;
 
    public int $amount;
 
    public function __construct(
        Currency $currency,
        int $amount,
    ) {
        $this->currency = $currency;
        $this->amount = $amount;
    }
}

Po novom nám stačí

class Money 
{
    public function __construct(
        public Currency $currency,
        public int $amount,
    ) {}
}

Návratové typy static a mixed

Aj keď php dáva možnosť vracať self, static nebol platný typ návratovej hodnoty. PHP 8 zavádza static ako nový návratový typ.

Rovnako nám pribudol další typ mixed. Mixed znamená, že bude ako návratová hodnota použitý jeden z nasledových typov:

  • array
  • bool
  • callable
  • int
  • float
  • null
  • object
  • resource
  • string

Mixed môže byť použitý aj ako parameter alebo ako typ parametru. Taktiež treba mať na pamäti, že null je súčastou mixed, preto nemôže byť nullable.

Nasledujúci zápis vyvolá chybu:

// Fatal error: Mixed types cannot be nullable, null is already part of the mixed type.
function bar(): ?mixed {}

Ďalšie zaujímavé novinky php 8 si predstavíme v druhej časti.