php 8 hlavní aktualizace

PHP 8 - Nové funkce a potenciální problémy s WordPress

PHP 8 je tady! Hlavní aktualizace byla vydána 26. listopadu 2020 a přináší nám některé zásadní změny a mnoho nových funkcí. V takovém případě PHP 8 skutečně vede k lepšímu výkonu a k tomu, zda jste WordPress User:in by již měl být aktualizován na novou verzi, vysvětluje vám náš vývojář Marten.

Úvod do PHP 8 

PHP 8 byl poprvé představen 18. června 2020 a od července je ve zmrazení funkcí. Až do vydání 26. listopadu nebylo možné přidat žádné nové přírůstky. Zvláštní vlastností této verze je, že přeskočíme PHP 7.5 a půjdeme přímo na PHP 8. A tento skok je spojen s různými funkcemi. 

Jedna z nejčastějších otázek o PHP 8, která WordPress Uživatel:Nastavení je pravděpodobně: Zlepší PHP 8 výkon mého webu?

Odpověď na tuto otázku zní (jako často): "Záleží..."

Když byl PHP upgradován z verze 5 na verzi 7, došlo k obrovskému zvýšení výkonu. S PHP 8 se však nedostavíte k obecnému zlepšení výkonu,pokud vaše aplikace nepočítá mnoho matematických funkcí (viz naše část na kompilátoru JIT). To je způsobeno především skutečností, že optimalizace kódu PHP je již velmi dobře zavedena.

Ale kdo dokonce říká, že výkon je omezen na dobu kompilace? Pokud jde o mě, jako vývojář bych měřil výkon různými způsoby, včetně funkcí, které mám k dispozici pro psaní dobře strukturovaného kódu. A PHP 8 je plná nových dobrot. Tak začněme!

Aktualizace funkcí v PHP 8 

PHP 8 má osm nových hlavních funkcí, které bych vám rád představil: 

  1. Kompilátor JIT 
  2. Atributy
  3. Pojmenované argumenty
  4. Porovnat výrazy 
  5. Vyvolání výrazů
  6. Statický návratový typ 
  7. Typ sjednocení 
  8. Smíšené typy 

Kompilátor JIT (just-in-time)(rfc)

Když je spuštěn PHP kód, obvykle se provádí kompilací na virtuální příkazy, které běží na virtuálním počítači. JIT to změní kompilováním kódu do strojového kódu x86 a poté spuštěním tohoto kódu přímo na procesoru. U aplikací, které jsou silně závislé na matematických funkcích, by to mělo zlepšit výkon. To však nelze u průměrné webové aplikace očekávat (viz graf). 

PHP 8 - Nové funkce a potenciální problémy s WordPress
Zdroj

Příklad zvýšení výkonu, které jit může dosáhnout, je nejlepší sledovat následující video.

V podstatě se zredukuje na vaši aplikaci, která běží plynuleji s novou verzí, když používáte PHP pro matematickou úlohu náročnou na práci. Ale pokud máte rádi většinu PHP WordPress Uživatel:inuse, pak si nevšimnete žádných velkých změn. Více o tom, co PHP 8 dělá pro operátory: WordPress Webové stránky znamenají, vysvětlím níže. 

Pokračujeme s novými funkcemi:

Atributy v2 (rfc, rfc)

Jednou z inovací v PHP 8 (což vedlo k rozsáhlým diskusím v komunitě PHP) jsou atributy – známé v mnoha dalších jazycích jako "anotace". Atributy nahrazují ukládání metadat docblocky v PHP 8. Museli jste to použít k deklarování metadat pro třídy, metody, funkce a argumenty strukturovaně. 

Jak si dokážete představit, použití komentářů kódu k použití metadat nebylo ideální, ale fungovalo to. Naštěstí už tento problém nebudeme mít. 

Atributy lze použít s Syntax #[...] být deklarovány.

Zde je několik příkladů z knihovny RFC o tom, jak lze atributy použít na různé datové typy.

#[ExampleAttribute]
class Foo
{
    #[ExampleAttribute]
    public const FOO = 'foo';
 
    #[ExampleAttribute]
    public $x;
 
    #[ExampleAttribute]
    public function foo(#[ExampleAttribute] $bar) { }
}
 
$object = new #[ExampleAttribute] class () { };
 
#[ExampleAttribute]
function f1() { }
 
$f2 = #[ExampleAttribute] function () { };
 
$f3 = #[ExampleAttribute] fn () => 1;

V tomto okamžiku stojí za zmínku, že RFC pro atributy prošla některými změnami, protože byla původně navržena, což ukazuje úsilí a úvahy vložíné do této aktualizace. 

Pojmenované argumenty (rfc)

Pojmenované argumenty poskytují větší flexibilitu při volání funkcí. Zatím je třeba volat funkci a předat každý argument v pořadí určeném funkcí. 

// Using positional arguments:
array_fill(0, 100, 50);

Pojmenované argumenty umožňují definovat název pro každý parametr. A nyní, jak je popsáno níže, mohou být volána s výjimkou pořadí: 

// Using named arguments:
array_fill(start_index: 0, num: 100, value: 50);

Mohou být také nazývány takto:

array_fill(value: 50, num: 100, start_index: 0);

Je také možné použít hybrid obou, který umožňuje kombinovat pojmenované parametry a polohy almentos, což zlepšuje čitelnost kódu: 

htmlspecialchars($string, double_encode: false);

Porovnat výrazy (rfc)

Výrazy zápasu jsou navrženy tak, aby vyřešily některé dlouhodobé problémy ve funkčnosti jeho předchůdce Switch. 

Operátor porovnání

Switch používá operátor porovnání převodu typu (==), který může způsobit problémy. Naproti tomu Match používá přísný operátor porovnání (===), bez ohledu na strict_types.

Návratová hodnota

Příkazy přepnutí často generují hodnotu, která je potřebná později v toku programu. To může zabránit nastavení této hodnoty v příkazu Switch, což pak může způsobit problémy ve skriptu PHP. Kromě toho je syntaxe příkazu Switch obtížně čitelná pro vnořené příkazy přepínače.

switch (1) {
    case 0:
        $y = 'Foo';
        break;
    case 1:
        $y = 'Bar';
        break;
    case 2:
        $y = 'Baz';
        break;
}
 
echo $y;
//> Bar

Nový výraz zápasu tento problém eliminuje přiřazením návratové hodnoty přímo pro každou větev zápasu(=>), která je intuitivnější. 

echo match (1) {
    0 => 'Foo',
    1 => 'Bar',
    2 => 'Baz',
};
//> Bar

Fallthrough

Pokud se příkaz switch po každém případu nerozbije, bude pokračovat do dalšího případu, i když se kód přeruší. To bylo navrženo tak, aby funkce přepínače mohl spouštět více bloků kódu za sebou. To je však doposud běžný zdroj chyb. 

Match implementoval implicitní přerušení po každé větvi (=>). Mezi jednotlivými podmínkami lze nyní provést více podmínek čárkami: 

match ($x) {
    1, 2 => {
        // Same for 1 and 2
    },
    3, 4 => {
        if ($x === 3) {
            // Only 3
        }
        // Same for 3 and 4
    },
}

Vyvolání výrazů (rfc)

V PHP 8 se příkaz throw stal výrazem. To znamená, že technicky řečeno, hod může nyní vrátit hodnotu. To je užitečné v tom smyslu, že hod lze nyní použít na mnoha dalších místech, jako jsou .B Funkce šipky nebo Operátory slučování. 

Funkce šipky: 

$callable = fn() => throw new Exception();

Provozovatelé společnosti Coalesce: 

// $value is non-nullable.
$value = $nullableValue ?? throw new InvalidArgumentException();
 
// $value is truthy.
$value = $falsableValue ?: throw new InvalidArgumentException();

Ternární operátoři:

// $value is only set if the array is not empty.
$value = !empty($array)
    ? reset($array)
    : throw new InvalidArgumentException();

Statický návratový typ (rfc)

Jak uvádí tento dokument RFC , typ statického návratu umožňuje návrat názvu speciální třídy "static" z metody: "Statický název speciální třídy v PHP odkazuje na třídu, na které byla metoda skutečně volána, i když je metoda zděděna. Toto je známé jako "pozdní statická vazba" (LSB). Toto RFC navrhuje, aby byl statický také použitelný jako návratový typ (vedle již použitelných typů self a parent)."

Statický údaj však v tomto případě nelze použít jako součást parametru. Statický návrat bude odkazovat na třídu, která byla volána. 

Typy sjednocení (rfc)

Typy sjednocení umožňuje deklarovat typ hodnoty, kterou očekáváte od vstupu. V některých jazycích se tomu říká schéma. To je syntakticky podporováno použitím  | e.B. string|array|int) definováno. Tím však magie nekončí, protože můžete také použít definované třídy, jako jsou:

class MyClass {

}
function myFunction(string|array|int|MyClass){

}

Typy unie se již v PHP používají. Jak je však uvedeno níže, jsou implementovány pomocí metody anotace phpdoc. 

class Number {
    /**
     * @var int|float $number
     */
    private $number;
 
    /**
     * @param int|float $number
     */
    public function setNumber($number) {
        $this->number = $number;
    }
 
    /**
     * @return int|float
     */
    public function getNumber() {
        return $this->number;
    }
}

Další informace o použití jsou k tomuto příkladu z knihovny RFC:

class Number {
    private int|float $number;
 
    public function setNumber(int|float $number): void {
        $this->number = $number;
    }
 
    public function getNumber(): int|float {
        return $this->number;
    }
}

To vše znamená, že můžete použít více typů vstupů pro stejnou funkci namísto pouze jednoho, což umožňuje vyšší stupeň opětovné použitelnosti kódu.

Smíšené typy (rfc)

V novějších verzích PHP bylo možné deklarovat očekávaný typ vstupních a návratových dat. PHP však vždy nepodporuje typy, a to je problém. V některých případech byl typ vynechán nebo jednoduše zapomenut. Mixed Typy se nyní snaží tento problém vyřešit.

Ukázat mixed typ by byl ekvivalentem array|bool|callable|int|float|null|object|resource|string

Zde je příklad z dokumentu RFC o tom, jak to použít:

// Valid example
 
class A
{
    public function foo(int $value) {}
}
 
class B extends A
{
    // Parameter type was widened from int to mixed, this is allowed
    public function foo(mixed $value) {}
}

Další funkce PHP 8

Učinit řazení stabilním(rfc)

Stabilita je přidána ke všem funkcím, které spadají do části Řazení(například.

sort, rsort, usort, sortiment, arsort, uasort, ksort, krsort, uksort, array_multisort).

Doporučil bych, abyste si to přečetli v dokumentu RFC a porovnali to s vaší aplikací, protože změna této funkce z nestabilního na stabilní třídění by mohla negativně ovlivnit váš kód.

Propagace vlastností konstruktoru (rfc)

Tato funkce je navržena tak, aby pomohla urychlit pracovní postup dev a omezit chyby. V současné době definování objektu hodnot vyžaduje sadu často používaných stříkaček, jak je vidět z dokumentace RFC níže:

class Point {
    public float $x;
    public float $y;
    public float $z;
 
    public function __construct(
        float $x = 0.0,
        float $y = 0.0,
        float $z = 0.0,
    ) {
        $this->x = $x;
        $this->y = $y;
        $this->z = $z;
    }
}

Tato metoda vyžaduje, aby se vlastnosti opakovaly třikrát. Zlepšení je krátký vzorec níže: 

class Point {
    public function __construct(
        public float $x = 0.0,
        public float $y = 0.0,
        public float $z = 0.0,
    ) {}
}

Operátor nullsafe (rfc)

V tomto bloku je nový operátor! 

Anstelle des klassischen <code>!== null</code> haben wir nun das bekommen: <code>?-></code>. Es scheint zunächst merkwürdig, aber wenn man es unter dem Gesichtspunkt der Verkettung von „if-Statements“ betrachtet, dann wird die Anwendung ziemlich deutlich: 

$country =  null;
 
if ($session !== null) {
    $user = $session->user;
 
    if ($user !== null) {
        $address = $user->getAddress();
 
        if ($address !== null) {
            $country = $address->country;
        }
    }
}
 
// do something with $country
$country = $session?->user?->getAddress()?->country;
 
// do something with $country

str_contains (rfc)

Tato docela pěkná nová funkce vrátí booleovské hodnoty (true/false), když je řetězec nalezen v jiném řetězci. To vyžaduje dva argumenty, řetězec, který je hledat, a řetězec, který chcete vyhledat.

str_contains('php8', '8'); // true
str_contains('php8', 'wordpress'); // false

U ještě užitečnějších řetězcových filtrů byste se měli podívat na následující nové funkce:

str_starts_with('haystack', 'hay'); // true
str_ends_with('haystack', 'stack'); // true

Oba tyto dva poskytují logický výsledek a fungují stejným způsobem jako str_contains().

Slabé mapy (rfc)

V PHP, když nastavíte proměnnou na hodnotu objektu, obvykle se vytvoří odkaz na tento objekt, ale ne nový objekt. 

V tomto případě můžete skončit s mnoha odkazy na objekt, ale pouze s jedním objektem. Problém je v tom, že když je čas odstranit tento objekt, PHP počítá počet odkazů, které tento objekt má. A pokud je to více než jeden, PHP odmítne odstranit tento objekt. 

Slabé mapy řeší tento problém vytvořením "slabého" odkazu na odpovídající objekt. Po odstranění objektu jsou všechny proměnné se slabým odkazem na tento objekt nastaveny na nulu. 

Nezachycování úlovků (rfc)

Try-catch blok je docela úžasný, pokud jde o hlášení chyb a nyní existuje ještě rychlejší způsob, jak ho implementovat. A ne, to opravdu neovlivní čitelnost. 

Způsob "staré školy" znamenal, že jste museli předat výjimku catch na proměnnou, jako je tato:

function catchMeWhenIFall(){
	try {
        throw new Exception('NOPE - GRAVITY');
    } catch (Exception $e) {
        return $e->getMessage();
    }

}

Nyní však již není nutné definovat proměnnou, která má být předána do vašeho bloku catch.

try {
	throw new Exception('FOO!');
 catch  (){
	//Do some code here
 }

}

Ostatní čtecí materiál PHP 8

Pokud se chcete o vydání PHP 8 dohlédnout více nebo si příklady kódu RFC prohlédnout sami, stačí se podívat na oficiální zprávu o vydání

"*" povinný údaj

Rád bych se přihlásil k odběru newsletteru, abych byl informován o nových článcích na blogu, e-knihách, funkcích a novinkách ve WordPressu. Svůj souhlas mohu kdykoli odvolat. Více informací v našich Zásadách ochrany osobních údajů.
Toto pole slouží k ověření a nemělo by se měnit.

Jste připraveni na PHP 8? 

Žádný vývojář není fanouškem aktualizací s velkými změnami (pamatujeme si WordPress 5.0 a Gutenberg ), kde existuje riziko, že se váš kód rozbije a počká na hodiny práce nebo kompletní přestavbu. Pokud však váš kód již pracoval čistě s PHP 7.4., neměli byste mít žádné problémy s PHP 8 (více o PHP a PHP WordPress v další kapitole). 

Pokud však používáte starší verzi PHP, měli byste před aktualizací zkontrolovat seznam zastaralých funkcí. V dokumentaci PHP "Appendices" najdete kompletní seznam předchozích funkcí, změn a problémů s aktualizací z jedné verze PHP na další. 

Aktualizovat WordPress na PHP 8? 

Tato citace z Yoast "WordPress a PHP 8 Compatibility Report" již naznačuje, že vy jako uživatel WordPress byste neměli brát aktualizaci na PHP 8 lehce. Závěr zprávy posiluje tento předpoklad, protože Omar Reiss píše: "Pouhým zkoumáním podmnožiny průlomových změn v PHP 8 bychom již mohli potvrdit, že to pravděpodobně způsobí velké poškození na stránkách s nejasným původem tohoto zlomu. Často se chyba vyskytne na jednom místě, ale je způsobena pluginem nebo motivem na jiném místě, takže tyto problémy je těžké ladit.

Tyto problémy s kompatibilitou byly také důvodem, proč PHP 8 nebylo okamžitě k dispozici našim zákazníkům. Zejména po velkých aktualizacích má vždy smysl dát vývojářům pluginů WordPress dostatek času na jakékoli úpravy a počkat prozatím. Nyní můžete snadno používat Raidboxes Dashboard Aktualizujte svůj web na PHP 8 nebo PHP 8.1. Jak vytvořit novou verzi PHP na adrese Raidboxes správně testováno, vysvětlujeme v tomto příspěvku Helpcenter.

Náš závěr o PHP 8

PHP 8 je ve srovnání se svými předchozími verzemi velkým krokem vpřed. I když se nemusí okamžitě zobrazit dramatické zlepšení výkonu (v závislosti na tom, jak používáte PHP 8), měli byste zvážit aktualizaci – alespoň poté, co jste ji otestovali, je stabilní a vaše WordPress hoster je k dispozici. Nová verze je přirozeným pokrokem a její implementací dříve než později vytvoříte pevný základ pro budoucí rozšíření, růst a budoucí vylepšení výkonu.

Další otázky týkající se PHP 8?

Doufám, že jsem vám mohl představit vzrušující inovace PHP 8 s tímto článkem. Máte nějaké další otázky k tomuto tématu? Použijte funkci komentáře. Chcete více tipů na toto téma WordPress , webový design a další? Pak nás sledujte na Twitteru, Facebooku nebo prostřednictvím našeho zpravodaje.

Líbil se vám tento článek?

Svou recenzí nám pomůžete zlepšit náš obsah.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Povinná pole jsou označena *.