PHP 8 – Nové funkce, vylepšení a potenciální problémy WordPress

Marten Gülink Naposledy aktualizováno 11. ledna 2021
10 min.
php 8 hlavní aktualizace
Naposledy aktualizováno 11. ledna 2021


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!

Klíčové aktualizace nových 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, vylepšení a potenciální problémy WordPress
Zdroj

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

Youtube

Načtením videa souhlasíte se zásadou ochrany osobních údajů YouTube.
Zjistěte více

Stáhnout video

PGlmcmFtZSBzcmM9Imh0dHBzOi8vd3d3LnlvdXR1YmUtbm9jb29raWUuY29tL2VtYmVkL2RXSDY1cG1uc3JJIiBhbGxvdz0iYWNjZWxlcm9tZXRlcjsgYXV0b3B l0ZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZSIgYWxsb3dmdWxsc2NyZWVuPSIIIHdpZHRoPSI1NjaiIGhlaWdodD0iD

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í tato RFC, Static Return Type umožňuje vrácení speciálního názvu 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. To se označuje jako "pozdní statická vazba" (LSB). Tato RFC navrhuje, aby statická byla také použitelný jako návratový typ (vedle již použitelných typů self a parent)."

Static však nelze v tomto případě 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! 

Namísto <code>!== null</code> klasického máme nyní toto: <code>?-></code> . Zpočátku se to zdá divné, ale když se na to podíváte z hlediska řetězení "if-statements", pak se aplikace stává zcela jasnou: 

$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é s odkazem Slabé mapy 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í

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ší. 

Pokud chcete WordPress na PHP 8? 

U dobře psacích základů kódu nebo základů kódu, které zůstaly aktuální s nejnovějšími verzemi PHP, není velký problém [migrovat na PHP 8]. Skutečností však je, že WordPress není takový základ kódu.

Omar Reiss, yoast

Tento citát z Yoastu " WordPress a zpráva o kompatibilitě PHP 8" již navrhuje, abyste jako WordPress Při aktualizaci na PHP 8 by se nemělo brát na lehkou váhu. Závěr zprávy tento předpoklad posiluje, protože Omar Reiss píše: "Pouze zkoumáním podmnožiny zlomových změn v PHP 8 bychom již mohli potvrdit, že to pravděpodobně způsobí velké rozbití na místech s nejasným původem tohoto zlomení. Často se chyba vyskytuje na jednom místě, ale je způsobena plugin Nebo theme na jiném místě, což znesná ladění těchto problémů."

Tyto problémy s kompatibilitou jsou také jedním z důvodů, proč PHP 8 není okamžitě RAIDBOXES Přístrojová deska pro naše zákazníky: je k dispozici uvnitř. Zejména po velkých aktualizacích má vždy smysl Plugin Vývojáři: dejte dostatek času na jakékoli úpravy a počkejte na čas. Jakmile se ujistíme, že existuje standardní WordPress Instalace nedává žádné problémy a PHP 8 běží stabilní a výkonný v našem systému, samozřejmě poskytneme PHP 8.

Pokud již máte přístup k PHP 8 a nová verze je připojena k vašemu WordPress web, měli byste nejprve vytvořit zálohu, jako jste to udělali před jakoukoli aktualizací. Jak získat novou PHP verzi RAIDBOXES otestujte správně, můžete si přečíst tento příspěvek centra nápovědy (zde pomocí příkladu PHP 7.2).

Náš závěr

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.

Jako webový vývojář u RAIDBOXES Marten neustále pracuje na nových funkcích pro naše zákazníky. Na "wp unboxed" také boduje se svými znalostmi o vývoji webových aplikací, WordPress a našeho dashboardu. A také se ve svém volném čase rád zabývá self hostingem a nejnovějšími trendy na internetu.

Podobné výrobky

Komentáře k tomuto článku

Napsat komentář

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