PHP 8 - Nye funktioner, forbedringer og potentielle problemer med WordPress

Marten Gülink Senest opdateret den 11.
10 Min.
php 8 større opdatering
Senest opdateret den 11.


PHP 8 er her! The Major Update blev udgivet på November 26, 2020 og bringer os nogle grundlæggende ændringer samt mange nye funktioner. I så fald PHP 8 virkelig fører til bedre ydeevne, og om du er WordPress Bruger:in skal allerede opdatere til den nye version, vores udvikler Marten forklarer dig.

Introduktion til PHP 8 

PHP 8 blev først introduceret den 18 juni 2020 og har været i en funktion fryse siden juli. Ingen nye tilføjelser kunne tilføjes indtil udgivelsen den 26. Et særligt træk ved denne version er, at vi springer PHP 7,5 og gå direkte til PHP 8. Og dette spring er forbundet med en række funktioner. 

Et af de mest almindelige spørgsmål om PHP 8, der WordPress Bruger: Indstilling er det sandsynligvis: Vil PHP 8 forbedre effektiviteten af min hjemmeside?

Svaret på dette spørgsmål er (som så ofte): "Det afhænger..."

Når PHP blev opgraderet fra version 5 til version 7, var der en enorm ydeevne løft. Men med PHP 8 vil du ikke se en generel forbedring af ydeevnen,medmindre din ansøgning beregner mange matematiske funktioner (se vores afsnit om JIT compiler). Dette skyldes primært det faktum, at koden optimering af PHP er allerede meget veletableret.

Men hvem selv siger, at udførelsen er begrænset til kompilering tid? For mit vedkommende, som udvikler, ville jeg måle ydeevnen i en række forskellige måder, herunder de funktioner til rådighed for mig at skrive velstruktureret kode. Og PHP 8 er fuld af nye goodies. Så lad os komme i gang!

Vigtige nye funktionsopdateringer i PHP 8 

PHP 8 har otte nye hovedfunktioner, som jeg gerne vil introducere dig: 

  1. JIT-compileren 
  2. Attributter
  3. Navngivne argumenter
  4. Match udtryk 
  5. Kast udtryk
  6. Statisk returtype 
  7. Fagforeningstype 
  8. Blandede typer 

JiT (just-in-time) compiler (rfc)

Når PHP-kode udføres, sker det normalt ved at kompilere til virtuelle udsagn, der kører på en virtuel maskine. JIT vil ændre dette ved at samle koden i x86-maskinkode og derefter køre koden direkte på CPU'en. For programmer, der er stærkt afhængige af matematiske funktioner, bør dette forbedre ydeevnen. Dette kan dog ikke forventes for det gennemsnitlige webprogram (se diagram). 

PHP 8 - Nye funktioner, forbedringer og potentielle problemer med WordPress
Kilde

For et eksempel på den ydeevne ekstraudstyr, jit kan opnå, er det bedst at se følgende video.

Youtube

Når du indlæser videoen, accepterer du YouTubes politik om beskyttelse af personlige oplysninger.
Få mere at vide

Hent video

PGlmcmFtZSBzcmM9Imh0dHBzOi8vd3d3LnlvdXR1YmUtbm9jb29raWUUY29tL2VtYmVkL2RXSDY1cG1uc3JJIiBhbGxvdz0iYWNjZWxlcm9tZXRlcjsgYXV0b3B l0ZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZSIgYWxsb3dmdWxsc2NyZWVuPSIiHZHPPP1NJAiIGhlaWdodD0iMz

Dybest set, det kan koges ned til din ansøgning kører glattere med den nye version, når du bruger PHP for en arbejdskrævende, matematisk opgave. Men hvis du kan lide de fleste PHP WordPress Bruger: inuse, så vil du ikke mærke nogen store ændringer. Mere om, hvad PHP 8 gør for operatører: WordPress Websites betyder, jeg forklare nedenfor. 

Vi fortsætter med de nye funktioner:

Attributter v2 (rfc, rfc)

En af de nyskabelser i PHP 8 (som har ført til omfattende diskussioner i PHP samfund) er attributter - kendt på mange andre sprog som "anmærkning". Attributter erstatte deponering af metadata med docblocks i PHP 8. Du har været nødt til at bruge dette til at erklære metadata for klasser, metoder, funktioner og argumenter på en struktureret måde. 

Som du kan forestille dig, var det ikke ideelt at bruge kodekommentarer til at anvende metadata, men det fungerede. Heldigvis vil vi ikke længere have dette problem. 

Attributter kan bruges sammen med Syntax #[...] deklareret.

Her er nogle eksempler fra RFC'en på, hvordan attributter kan anvendes på forskellige datatyper.

#[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;

På dette tidspunkt er det værd at bemærke, at RFC for Attributes har gennemgået nogle ændringer, siden den oprindeligt blev designet, hvilket viser den indsats og overvejelse, der er lagt i denne opdatering. 

Navngivne argumenter (rfc)

Navngivne argumenter giver dig større fleksibilitet, når du kalder funktioner. Indtil videre skal du kalde en funktion og videregive hvert argument i den rækkefølge, der er angivet af funktionen. 

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

Med navngivne argumenter kan du definere et navn for hver parameter. Og nu, som beskrevet nedenfor, kan disse kaldes undtagen i rækkefølge: 

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

De kan også kaldes som følger:

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

Det er også muligt at bruge en hybrid af begge, som gør det muligt at kombinere navngivne parametre og position almentos, hvilket forbedrer kodens læsbarhed: 

htmlspecialchars($string, double_encode: false);

Søg efter udtryk (rfc)

Match Expressions er designet til at løse nogle langvarige problemer i funktionaliteten af sin forgænger Switch. 

Sammenligningsoperator

Switch bruger en sammenligningsoperator til tekstkonvertering (==), som kan forårsage problemer. Match bruger derimod en streng sammenligningsoperator (===), uanset strict_types.

Returværdi

Skift opgørelser genererer ofte en værdi, der er nødvendig senere i programflowet. Dette kan forhindre denne værdi i at blive angivet i Switch-sætningen, som derefter kan forårsage problemer i PHP-scriptet. Desuden er syntaksen i switch-sætningen svær at læse for indlejrede switchsætninger.

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

Det nye matchudtryk eliminerer dette problem ved at tildele returværdien direkte for hver matchgren(=>), hvilket er mere intuitivt. 

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

Faldgennemfald

Hvis en switch-sætning ikke går i stykker efter hvert tilfælde, fortsætter den til det næste tilfælde, selvom koden går i stykker. Dette blev designet, så switch-funktionerne kan udføre flere kodeblokke efter hinanden. Dette har imidlertid hidtil været en almindelig kilde til fejl. 

Match har implementeret en implicit pause efter hver gren (=>). Flere betingelser kan nu udføres af kommaer mellem hver betingelse: 

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

Kast udtryk (rfc)

I PHP 8, er kast erklæring blevet et udtryk. Det betyder, at kaste teknisk set nu kan returnere en værdi. Dette er nyttigt i den forstand, at kaste nu kan bruges i mange flere steder, såsom .B Arrow Functions eller Coalesce Operators. 

Pilefunktioner: 

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

Samlevirksomheder: 

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

Ternære operatører:

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

Statisk returtype (rfc)

Som denne RFC hedder det, Static Return Type tillader returnering af den særlige klasse navn "statisk" fra en metode: "Den statiske særlige klasse navn i PHP refererer til klassen en metode blev faktisk opfordret, selv om metoden er nedarvet. Dette kaldes "sen statisk binding" (LSB). Denne RFC foreslår at gøre statisk også brugbar som en returtype (ved siden af de allerede brugbare selv- og forældretyper)."

Static kan dog ikke bruges som en del af en parameter i dette tilfælde. Det statiske afkast henviser til den klasse, der blev kaldt. 

Fagforeningstyper (RFC)

Fagforeningstyper giver dig mulighed for at angive den type værdi, du forventer af et input. På nogle sprog kaldes dette et skema. Dette understøttes syntaktisk ved brug af  | (e.B. string|array|int) defineret. Men magien stopper ikke der, fordi du også kan bruge definerede klasser som:

class MyClass {

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

}

Eu-typer er allerede i brug i PHP. Men som vist nedenfor, er de gennemført ved hjælp af phpdoc annotation metode. 

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;
    }
}

Du kan finde lidt mere kontekst om brug i dette eksempel fra 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;
    }
}

Alt dette betyder, at du kan bruge flere inputtyper til den samme funktion i stedet for kun én, hvilket giver mulighed for en højere grad af genbrugelighed af koden.

Blandede typer (rfc)

I nyere PHP versioner, var det muligt at erklære den forventede type input og returnere data. Men PHP har ikke altid støttet typer, og det er et problem. I nogle tilfælde er en type blevet udeladt eller simpelthen glemt. Mixed Typer forsøger nu at løse dette problem.

A mixed type ville svare til array|bool|callable|int|float|null|object|resource|string

Her er et eksempel fra RFC dokumentar om, hvordan man bruger dette:

// 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) {}
}

Yderligere PHP 8-funktioner

Gør sortering stabil (rfc)

Stabilitet føjes til alle funktioner, der falder ind under Sort(f.eks.

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

Jeg vil anbefale, at du læser dette i RFC dokumentarfilm og sammenligne det med din ansøgning, som ændrer denne funktionalitet fra ustabil til stabil sortering kan påvirke din kode negativt.

Constructor Ejendom Promotion (RFC)

Denne funktion er udviklet til at gøre det hurtigere at udvikle din arbejdsproces og reducere fejl. I øjeblikket kræver definitionen af et objekt af værdier et sæt standardplader, som det fremgår af RFC-dokumentationen nedenfor:

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;
    }
}

Denne metode kræver, at egenskaberne gentages tre gange. Forbedringen er den korte formel nedenfor: 

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

Nullsafe Operator (rfc)

Der er en ny operatør i denne blok! 

I stedet for den <code>!== null</code> klassiske, har vi nu fået dette: <code>?-></code> . Det virker mærkeligt i første omgang, men hvis man ser på det ud fra det synspunkt, at kæde af "hvis-udsagn", så ansøgningen bliver helt klart: 

$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)

Denne smukke nice nye funktion returnerer en boolesk værdi (sand / falsk), når en streng findes i en anden streng. Dette kræver to argumenter, strengen at søge efter og strengen at søge efter.

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

Hvis du vil have endnu mere nyttige strengfiltre, skal du se på følgende nye funktioner:

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

Disse to vil både give et boolesk resultat og arbejde på samme måde som str_contains().

Svage kort (rfc)

I PHP oprettes der normalt en reference til det pågældende objekt, men ikke et nyt objekt, når du angiver en variabel til et objekts værdi. 

I dette tilfælde kan du ende med mange referencer til et objekt, men kun ét objekt. Problemet er, at når det er tid til at slette dette objekt, PHP tæller antallet af referencer, at dette objekt har. Og hvis det er mere end én, php vil nægte at slette dette objekt. 

Svage Kort løser dette problem ved at oprette en "svag" reference til det tilsvarende objekt. Når objektet er slettet, er alle variabler med referencen Svage kort til dette objekt sat til nul. 

Ikke-fanger fangster (rfc)

En prøve-catch blok er temmelig awesome, når det kommer til fejlrapportering og nu er der en endnu hurtigere måde at gennemføre det. Og nej, det vil ikke påvirke læsbarheden. 

Den måde, den "gamle skole" betød, at du var nødt til at videregive din Fangst Undtagelse til en variabel som denne:

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

}

Men nu behøver du ikke længere at definere den variabel, der skal overføres til din fangstblok.

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

}

Andet PHP 8 læsemateriale

Hvis du ønsker at vide mere om udgivelsen af PHP 8 eller gennemse RFC kode eksempler selv, bare tage et kig på den officielle udgivelse besked

Er du klar til PHP 8? 

Ingen udvikler er en fan af opdateringer med store ændringer (vi husker WordPress 5.0 og Gutenberg ), hvor der er risiko for, at din kode går i stykker og venter på timers arbejde eller en fuldstændig genopbygning. Men hvis din kode allerede har arbejdet rent med PHP 7.4., bør du ikke have nogen problemer med PHP 8 (mere om PHP og PHP WordPress i næste kapitel). 

Men hvis du har en ældre PHP version i brug, bør du tjekke listen over forældede funktioner, før du opdaterer. I PHP "Appendiks" dokumentation vil du finde en komplet liste over tidligere funktioner, ændringer og problemer med opdateringen fra en PHP version til den næste. 

Hvis du vil WordPress til PHP 8? 

For velskrevet kodebaser eller kodebaser, der har opholdt sig up-to-date med de nyeste PHP versioner, er der ikke et stort problem [at migrere til PHP 8]. Virkeligheden er imidlertid, at WordPress er ikke sådan en kodebase.

Omar Reiss, yoast

Dette citat fra Yoast " WordPress og PHP 8 Compatibility Report" allerede tyder på, at du som en WordPress Bruger: i bør ikke tages let med opdateringen til PHP 8. Konklusionen af rapporten styrker denne antagelse, fordi Omar Reiss skriver: "Ved blot at undersøge en delmængde af at bryde ændringer i PHP 8 kunne vi allerede bekræfte dette vil sandsynligvis forårsage større brud på websteder med uklar oprindelse af denne brud. Ofte opstår fejlen på ét sted, men skyldes en plugin Eller theme et andet sted, hvilket gør disse spørgsmål svære at foretage fejlfinding."

Disse kompatibilitetsproblemer er også en af grundene til, at PHP 8 ikke er umiddelbart RAIDBOXES Dashboard for vores kunder: er tilgængelig indendørs. Især efter større opdateringer giver det altid mening at Plugin Udviklere: giv tid nok til eventuelle justeringer og vent på det tidspunkt. Så snart vi kan sikre, at der er en standard WordPress Installation giver ingen problemer og PHP 8 kører stabilt og performant på vores system, vil vi naturligvis give PHP 8.

Hvis du allerede har adgang til PHP 8, og den nye version er tilsluttet din WordPress hjemmeside, skal du først oprette en sikkerhedskopi, som du gjorde før enhver opdatering. Sådan får du en ny PHP version RAIDBOXES test korrekt, kan du læse denne Hjælp post (her ved hjælp af eksemplet med PHP 7,2).

Vores konklusion

PHP 8 er et stort skridt fremad i forhold til sine forgængerversioner. Selvom du måske ikke umiddelbart ser en dramatisk forbedring i ydeevne (afhængigt af hvordan du bruger PHP 8), bør du overveje opdateringen - i hvert fald når du har testet det, det er stabilt og din WordPress hoster er tilgængelig. Den nye version er en naturlig udvikling, og ved at implementere den hellere før end senere skaber du et solidt fundament for fremtidige udvidelser, vækst og fremtidige forbedringer af ydeevnen.

Flere spørgsmål om PHP 8?

Jeg håber, jeg var i stand til at introducere dig til de spændende nyskabelser i PHP 8 med denne artikel. Har du yderligere spørgsmål om dette emne? Brug kommentarfunktionen. Du vil have flere tips om emnet WordPress , Webdesign og meget mere? Følg os derefter på Twitter, Facebook eller via vores nyhedsbrev.

Som webudvikler hos RAIDBOXES Marten arbejder altid på nye funktioner til vores kunder. 19. wp unboxed " han også scorer med sin viden om webudvikling, WordPress og vores instrumentbræt. Og også i sin fritid, han kan lide at beskæftige sig med selv-hosting og de nyeste tendenser på internettet.

Lignende artikler

Kommentarer til denne artikel

Skriv svar på en

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *.