PHP 7.4, den næste mindre PHP 7 version, forventes at blive frigivet til den generelle tilgængelighed den 28. november 2019. Så det er på tide for os at dykke ind i nogle af de mest spændende tilføjelser og nye funktioner, der gør PHP hurtigere og mere pålidelige .

Faktisk, selvom PHP 7.4 signifikant øger ydeevnen og forbedrer kodelæsbarheden, vil PHP 8 være den rigtige milepæl for PHP-ydeevne, da forslaget til JIT-integration allerede er godkendt.

Alligevel, i dag går vi igennem nogle af de mest interessante funktioner og ændringer, vi forventer med PHP 7.4. Så før du læser dette indlæg, skal du sørge for at gemme følgende datoer:

  • 6. juni: PHP 7.4 Alpha 1
  • 18. juli: PHP 7.4 Beta 1 – Funktion fryser
  • 28. november: PHP 7.4 GA Udgivelse

Du kan tjekke den fulde liste over funktioner og tilføjelser på den officielle RFC-side.

Hvad er nyt i PHP med PHP 7.4?

I dette indlæg dækker vi flere ændringer og funktioner, som skal tilføjes til sproget med den endelige udgivelse af PHP 7.4:

PHP 7.4 er den kommende mindre udgivelse, der gør PHP hurtigere og mere pålidelig. 🚀Check vores dybe dyk ind i de nye funktioner! Click to Tweet

Glem array_merge: PHP 7.4 Brings Spread Operator i Array Expression

Tilgængelig siden PHP 5.6, er argumentet udpakning en syntaks for udpakning af arrayer og Traversables i argumentlister. For at udpakke et array eller en Traversable, skal det udfyldes af … (3 prikker), som vist i følgende eksempel:

function test(...$args) { var_dump($args); }
test(1, 2, 3);

Nu foreslår denne PHP 7.4 RFC at udvide denne funktion til array definitioner:

$arr = [...$args];

Den første erklærede fordel ved Spread Operator i array-udtryk handler om præstation. Faktisk siger RFC doc:

Spread operatør bør have bedre ydeevne end array_merge. Det er ikke kun fordi sprednings operatøren er en sprogstruktur, mens array_merge er en funktion, men også fordi kompilering tidsoptimering kan være effektiv for konstante arrayer.

En væsentlig fordel ved Spread operatør er, at den understøtter alle traversable objekter, mens array_merge-funktionen kun understøtter arrays.

Her er et eksempel på argument udpakning i array udtryk:

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);

Hvis du kører denne kode med i PHP 7.3 eller tidligere, kaster PHP en Parse-fejl:

Parse error: syntax error, unexpected '...' (T_ELLIPSIS), expecting ']' in /app/spread-operator.php on line 3

I stedet ville PHP 7.4 returnere en matrix:

array(5) {
	[0]=>
	string(6) "banana"
	[1]=>
	string(6) "orange"
	[2]=>
	string(5) "apple"
	[3]=>
	string(4) "pear"
	[4]=>
	string(10) "watermelon"
}

RFC angiver, at vi kan udvide det samme array flere gange. Desuden kan vi bruge Spread Operator-syntaxen overalt i arrayet, da normale elementer kan tilføjes før eller efter spredningsoperatøren. Så følgende kode vil fungere som vi måtte forvente:

$arr1 = [1, 2, 3];
$arr2 = [4, 5, 6];
$arr3 = [...$arr1, ...$arr2];
$arr4 = [...$arr1, ...$arr3, 7, 8, 9];

Det er også muligt at udpakke arrayer, der returneres af en funktion direkte til et nyt array:

function buildArray(){
	return ['red', 'green', 'blue'];
}
$arr1 = [...buildArray(), 'pink', 'violet', 'yellow'];

PHP 7.4 udsender følgende array:

array(6) {
	[0]=>
	string(3) "red"
	[1]=>
	string(5) "green"
	[2]=>
	string(4) "blue"
	[3]=>
	string(4) "pink"
	[4]=>
	string(6) "violet"
	[5]=>
	string(6) "yellow"
}

Vi kan også bruge generatorsyntaxen:

function generator() {
	for ($i = 3; $i 

Men vi har ikke lov til at udpakke arrays, der er vedtaget som reference. Overvej følgende eksempel:

$arr1 = ['red', 'green', 'blue'];
$arr2 = [...&$arr1];

Hvis vi ville forsøge at udpakke et array ved reference, kaster PHP følgende Parse-fejl:

Parse error: syntax error, unexpected '&' in /app/spread-operator.php on line 3

I hvert fald, hvis elementerne i den første matrix lagres ved reference, gemmes de som reference også i den anden matrix. Her er et eksempel:

$arr0 = 'red';
$arr1 = [&$arr0, 'green', 'blue'];
$arr2 = ['white', ...$arr1, 'black'];

Og her er hvad vi får med PHP 7.4:

array(5) {
	[0]=>
	string(5) "white"
	[1]=>
	&string(3) "red"
	[2]=>
	string(5) "green"
	[3]=>
	string(4) "blue"
	[4]=>
	string(5) "black"
}

Spread operatør forslaget bestået med 43 til 1 stemmer.

Pilfunktioner 2.0 (korte lukninger)

I PHP anses anonyme funktioner for at være ret verbose og vanskelige at implementere og vedligeholde. Denne RFC foreslår introduktion af den kortere og klarere syntaks af pilfunktionerne (eller korte lukninger), som skal gøre det muligt for os at rense vores PHP-kode betydeligt.

Overvej følgende eksempel:

function cube($n){
	return ($n * $n * $n);
}
$a = [1, 2, 3, 4, 5];
$b = array_map('cube', $a);
print_r($b);

PHP 7.4 tillader at bruge en mere kortfattet syntaks, og ovenstående funktion kan omskrives som følger:

$a = [1, 2, 3, 4, 5];
$b = array_map(fn($n) => $n * $n * $n, $a);
print_r($b);

I øjeblikket kan anonyme funktioner (lukninger) arve variabler defineret i forælderens omfang takket være sprogkonstruktionen, som vist nedenfor:

$factor = 10;
$calc = function($num) use($factor){
	return $num * $factor;
};

Men med PHP 7.4 er variabler defineret i parentes omfanget implicit fanget af værdi (implicit bindingsværdi bindende). Så vi kan skrive hele funktionen set ovenfor på en enkelt linje:

$factor = 10;
$calc = fn($num) => $num * $factor;

Den variable, der er defineret i parentesområdet, kan bruges i pilfunktionen nøjagtigt som om vi brugte use ($ var), og det er ikke muligt at ændre en variabel fra parentesområdet.

Den nye syntaks er en stor forbedring af sproget, da det giver os mulighed for at bygge mere læsbar og vedligeholdelig kode. Vi kan også bruge parameter og returtyper, standardværdier, argumentlister med variabel længde (variadiske funktioner), vi kan videregive og returnere ved reference osv. Endelig kan korte lukninger også bruges i klassemetoder, og de kan gøre brug af $ this variabel ligesom regulære lukninger.

Denne RFC er godkendt med 51 til 8 stemmer, så vi kan forvente, at det er en del af PHP 7.4 tilføjelser.

Null Coalescing Assignment Operator

Tilføjet med PHP 7, kommer coalesce operatøren (??) til nytte, når vi skal bruge en ternær operatør i forbindelse med isset (). Den returnerer den første operand, hvis den eksisterer og ikke er NULL. Ellers vender den tilbage til den anden operand. Her er et eksempel:

$username = $_GET['user'] ?? 'nobody';

Hvad denne kode gør er ret retfærdig: den henter anmodningsparameteren og angiver en standardværdi, hvis den ikke findes. Betydningen af ​​denne linje er klar, men hvad nu hvis vi havde langt længere variable navne som i dette eksempel fra RFC?

$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';

I det lange løb kan denne kode være lidt svært at vedligeholde. Så, med det formål at hjælpe udviklere med at skrive mere intuitiv kode, foreslår denne RFC indførelsen af ​​null coalescerings operatøren (?? =). Så i stedet for at skrive den forrige kode kunne vi skrive følgende:

$this->request->data['comments']['user_id'] ??= 'value';

Hvis værdien af ​​den venstre parameter er null, bruges værdien af ​​den højre parameter.

Bemærk, at mens coalesceoperatøren er en sammenligningsoperatør, er ?? = en assignment operator.

Dette forslag er godkendt med 37 til 4 stemmer.

Typede Egenskaber 2.0

Argument type erklæringer eller type tip, tillade at angive typen af ​​en variabel, der forventes at blive videregivet til en funktion eller en klassemetode. Type tip er en funktion tilgængelig siden PHP 5, og siden PHP 7.2 kan vi bruge dem med object datatypen. Nu PHP 7.4 bringer type hinting et skridt fremad ved at tilføje støtte til førsteklasses ejendomstype erklæringer. Her er et meget grundlæggende eksempel:

class User {
	public int $id;
	public string $name;
}

Alle typer understøttes, med undtagelse af void og callable:

public int $scalarType;
protected ClassName $classType;
private ?ClassName $nullableClassType;

RFC forklarer årsagen til, at void og callable ikke understøttes:

Ugyldigtype understøttes ikke, fordi det ikke er nyttigt og har uklar semantik.

Den kaldbare type understøttes ikke, fordi dens adfærd er kontekstafhængig.

Så vi kan sikkert bruge bool, int, float, string, array, object, iterable, self, parent, enhver klasse eller interface navn og nulstillede typer (?type).

Typer kan bruges på statiske egenskaber:

public static iterable $staticProp;

De er også tilladt med var notationen:

var bool $flag;

Det er muligt at angive standard egenskabsværdier, som selvfølgelig skal matche den deklarerede egenskabstype, men kun nulstillingsegenskaber kan have en standard NULL værdi:

public string $str = "foo";
public ?string $nullableStr = null;

Den samme type gælder for alle ejendomme i en enkelt erklæring:

public float $x, $y;

Hvad sker der, hvis vi gør en fejl på ejendomstype? Overvej følgende kode:

class User {
	public int $id;
	public string $name;
}

$user = new User;
$user->id = 10;
$user->name = [];

I koden ovenfor erklærede vi en streng-egenskabstype, men vi angiver en matrix som egenskabsværdi. I et sådant scenario får vi følgende fatale fejl:

Fatal error: Uncaught TypeError: Typed property User::$name must be string, array used in /app/types.php:9

Denne RFC er blevet godkendt med 70 til 1 stemmer.

WeakReference

Med denne RFC introducerer PHP 7.4 klassen WeakReference, som gør det muligt for programmører at beholde en reference til et objekt, der ikke forhindrer selve objektet i at blive ødelagt.

I øjeblikket understøtter PHP svage referencer ved at bruge en udvidelse som pecl-weakref. ALtså, den nye API er forskellig fra den dokumenterede WeakRef klasse.

Her er et eksempel fra forfatteren af ​​dette forslag, Nikita Popov:

$object = new stdClass;
$weakRef = WeakReference::create($object);

var_dump($weakRef->get());
unset($object);
var_dump($weakRef->get());

Det første var_dump-udskriftsobjekt (stdClass) # 1 (0) {}, mens den anden var_dump udskriver NULL, da det refererede objekt er blevet ødelagt.

Denne RFC bestod med 28 til 5 stemmer.

Covariant returns og contravariant parametre

Variance er en egenskab af klassehierarkier, der beskriver hvordan typer af en konstruktør påvirker undertyper. Generelt kan en type konstruktør være:

  • Invariant: Hvis typen af super-typen begrænser typen af subtypen.
  • Covariant: Hvis bestillingen af typer er bevaret (typer bestilles fra mere specifikke til mere generiske).
  • Contravariant: hvis det vendes ordren (typer bestilles fra mere generisk til mere specifik).

I øjeblikket har PHP for det meste invariant parameter og returtyper med få undtagelser. Denne RFC foreslår at tillade kovarians og modsvar på parametertyper og returtyper, der også giver flere eksempler på kode.

Her er et eksempel på kovariant returtype:

interface Factory {
	function make(): object;
}

class UserFactory implements Factory {
	function make(): User;
}

Og her er et eksempel på contravariant parameter type:

interface Concatable {
	function concat(Iterator $input); 
}
 
class Collection implements Concatable {
	// accepts all iterables, not just Iterator
	function concat(iterable $input) {/* . . . */}
}

Se RFC for at se nærmere på kovarians og modsvar i PHP 7.4.

Denne RFC bestod med 39 til 1 stemmer.

Preloading

Dette forslag fra Dmitry Stogov er en af vores foretrukne, fordi det burde bringe et betydeligt løft i præstationen. Preloading er processen med at indlæse biblioteker og rammer i OPCache ved modulinitialisering (læs mere om PHP livscyklus).

PHP livscyklus

PHP livscyklus (Billedekilde: PHP Internals)

Sådan virker preloading i Dmitrys ord:

Ved server opstart – inden der køres en applikationskode – kan vi indlæse et bestemt sæt PHP-filer i hukommelsen – og gøre deres indhold “permanent tilgængelig” til alle efterfølgende forespørgsler, som serveres af den pågældende server. Alle de funktioner og klasser, der er defineret i disse filer, vil være direkte tilgængelige for forespørgsler, ligesom interne enheder.

Disse filer er indlæst ved server opstart, udføres før enhver applikation og forbliver tilgængelig for fremtidige anmodninger. Det er godt med hensyn til ydeevne.

Preloading styres af et specifikt php.ini-direktiv: opcache.preload. Dette direktiv angiver et PHP script, som skal udarbejdes og udføres ved server opstart. Denne fil kan bruges til at forudindlæse yderligere filer, enten med dem eller via funktionen opcache_compile_file () (læs mere på PHP-dokumentation).

Men der er en ulempe. Faktisk siger RFC udtrykkeligt:

forudindlæste filer forbliver cached i opcache-hukommelsen for evigt. Ændring af deres tilsvarende kildefiler vil ikke have nogen virkning uden en anden server genstart.

Alle funktioner, der er defineret i forudindlæste filer, indlæses dog permanent i PHP-funktion og klassetabeller og forbliver tilgængelige for hver fremtidig anmodning. Dette vil medføre gode præstationsforbedringer, selv om disse forbedringer kan være betydeligt variable.

Du kan læse mere om begrænsningerne og undtagelserne fra forudindlæsning på den officielle Preloading RFC-side.

Ny tilpasset objekt serialiserings-mekanisme

Dette er et andet forslag fra Nikita Popov godkendt med stort flertal af stemmerne.

I øjeblikket har vi to forskellige mekanismer til brugerdefineret serialisering af objekter i PHP:

  • __sleep () og __wakeup () magiske metoder
  • The Serializable interface

Ifølge Nikita har begge disse muligheder problemer, der fører til komplekse og upålidelige kode. Du kan dykke dybt ind i dette emne i RFC. Her nævner jeg bare, at den nye serialiserings-mekanisme bør forhindre disse problemer ved at give to nye magiske metoder, __serialize () og __unserialize (), der kombinerer de to eksisterende mekanismer.

Dette forslag bestod med 20 til 7 stemmer.

Deprecations

Følgende funktioner / funktionaliteter fjernes med PHP 7.4. For en mere omfattende liste over afskrivninger, så tjek PHP 7.4 opgraderings-noter.

Ændre præcedens for samkøringsoperatøren

I PHP er “+” og “-” aritmetiske operatører og “.” Strengoperatøren for tiden forbundne og har samme prioritet (læs mere om Operator Precedence).

Udnytter din vært af de nyeste teknologier fuldt ud? På Kinsta bruger vi den bedste tech stack optimeret til WordPress. Tjek vores planer

F.eks. Overvej følgende linje:

echo "sum: " . $a + $b;

I PHP 7.3 producerer denne kode følgende advarsel:

Warning: A non-numeric value encountered in /app/types.php on line 4

Dette fordi sammenkoblingen evalueres fra venstre mod højre. Det er det samme som at skrive følgende kode:

echo ("sum: " . $a) + $b;

Denne RFC foreslår at ændre operatørernes forrang, idet “.” Der er lavere prioritet end “+” og “-” operatører, således at tilføjelser og subtraktioner altid vil blive udført før strengforbindelsen. Denne linje af kode skal svare til følgende:

echo "sum: " . ($a + $b);

Dette er et to-trins forslag:

  • Fra og med version 7.4 skal PHP udsende en meddelelse om deprecation, når der opstår et uhæmmet udtryk med “+”, “-” og “.”.
  • Den faktiske forandring af forrang for disse operatører skal tilføjes med PHP 8.

Begge forslag er godkendt med stort flertal af stemmerne.

Deprecate venstre-associative ternær operatør

I PHP er den ternære operatør, i modsætning til mange andre sprog, venstreforbundende. Ifølge Nikita Popof kan dette være forvirrende for programmører, der skifter mellem forskellige sprog.

I PHP er følgende kode korrekt:

$b = $a == 1 ? 'one' : $a == 2 ? 'two' : $a == 3 ? 'three' : 'other';

Det fortolkes som:

$b = (($a == 1 ? 'one' : $a == 2) ? 'two' : $a == 3) ? 'three' : 'other';

Og det kan føre til fejl, fordi det måske ikke er, hvad vi har til hensigt at gøre. Så denne RFC foreslår at deprecere og fjerne brugen af venstre-associativitet for ternære operatører og tvinge udviklere til at bruge parenteser.

Dette er et andet to-trins forslag:

  • Fra PHP 7.4 vil indlejrede ternarer uden eksplicit brug af parenteser kaste en deprecationsadvarsel.
  • Fra PHP 8.0 vil der være en kompilering runtime fejl.

Dette forslag er godkendt med 35 til 10 stemmer.

Hvad betyder PHP 7.4 for WordPress-brugere?

PHP er det mest anvendte server-side programmeringssprog på internettet. Ifølge W3Techs, pr. 28. maj 2019, er PHP brug stadig stigende:

PHP bruges af 79,0% af alle de websteder, hvis serverprogrammeringssprog vi kender.

PHP brug (maj 2019)

PHP brug (maj 2019)

Desværre anvendes PHP 5 stadig af 52,4% af alle websteder med et kendt programmeringssprog på server-side. Hvis du tilføjer antallet af brugere, der stadig bruger PHP 7.0, viser det sig, at et stort flertal af websteder kører ikke understøttede versioner af PHP.

Understøttede PHP-versioner

Understøttede PHP-versioner (Billedekilde: Supported Versions)

Ifølge den officielle WordPress Stats-side, som dette skriev, kører 67% af alle WordPress-hjemmesider på ikke understøttede versioner af PHP. Kun lidt over 3% bruger den nyeste version: PHP 7.3. Du kan se, at et stort flertal af brugere, over 31%, stadig kører på PHP 5,6.

WordPress PHP-versioner (maj 2019)

WordPress PHP-versioner (maj 2019)

Vi anbefaler stærkt at spørge din vært for en understøttet version af PHP, helst i henhold til de officielle krav fra WordPress. Som dette skrives, maj 2019 kræver WordPress:

  • PHP version 7.3 eller nyere.
  • MySQL version 5.6 eller nyere ELLER MariaDB version 10.1 eller nyere.
  • HTTPS-support

PHP 7 Performance

Tallene ovenfor er især nedslående kommer fra et præstationssynspunkt, da PHP 7 har vist sig at være betydeligt hurtigere. Her er et par statistikker:

  • Officielle PHP-benchmarks viser, at PHP 7 gør det muligt for systemet at udføre dobbelt så mange anmodninger pr. sekund i sammenligning med PHP 5.6 ved næsten halvdelen af ​​latens.
  • Christian Vigh offentliggjorde også en PHP præstations sammenligning, hvor han fandt ud af at PHP 5.2 var 400% langsommere end PHP 7.
  • Andrei Avram så hurtigere eksekveringstider og mindre hukommelsesforbrug i PHP 7,4 vers, nemlig PHP 7.3
  • Phoronix løb nogle tidlige benchmark-test med PHP 7.4 Alpha og så, at det var lidt hurtigere end PHP 7.3.

Vi kørte vores egne PHP performance benchmarks med PHP 7.3. Vi så, at WordPress 5.0 på PHP 7.3 kunne udføre næsten tre gange så mange transaktioner (anmodninger) pr. sekund i forhold til PHP 5.6. Vi frigiver PHP 7.4 benchmarks snart!

WordPress 5.0 PHP benchmarks

WordPress 5.0 PHP benchmarks

  • WordPress 5.0 PHP 5.6 benchmark: 91,64 req / sek
  • WordPress 5.0 PHP 7.0 benchmark resultater: 206.71 req / sek
  • WordPress 5.0 PHP 7.1 benchmark resultater: 210.98 req / sek
  • WordPress 5.0 PHP 7.2 benchmark resultater: 229.18 req / sek
  • WordPress 5.0 PHP 7.3 benchmark resultater: 253.20 req / sek 🏆

Mange er langsomme til at opdatere på grund af den tid, der er involveret i testning af nye alle deres tredjeparts plugins og temaer for at sikre, at de fungerer korrekt. Men mange gange kommer det ned til, at de simpelthen ikke har gjort det endnu.

Kontrol af din PHP-version

Ikke sikker på hvilken version af PHP du kører? En af de nemmeste måder at kontrollere er at bruge et værktøj som Pingdom eller Google Chrome Devtools. Den første HTTP-anmodningsoverskrift viser typisk versionen.

Check PHP version i Pingdom

Check PHP version i Pingdom

Dette afhænger af, at værten ikke ændrer X-Powered-By header-værdien. Men mange gør af sikkerhedsmæssige grunde (herunder Kinsta). Hvis det er tilfældet, kan du muligvis ikke se din PHP-version. I så fald, hvis du kører WordPress 5.2 eller nyere, er der et nyt websteds-sundhedsværktøj, du kan bruge. Gå over til “Værktøjer” → “Site Health” → “Info” og under “Server” sektionen finder du din servers PHP-version.

Tjek PHP version med WordPress Site Health Tool

Tjek PHP version med WordPress Site Health Tool

Alternativt kan du installere et gratis plugin som Version Info, som viser dig nogle grundlæggende serveroplysninger i foden af dit WordPress admin dashboard. Et par andre måder at se din PHP-version på er at uploade en fil via FTP, eller blot nå ud til din vært og spørge.

Opdatering til PHP 7.4

Den endelige version af PHP 7.4 er ikke her endnu. Du kan dog teste dit WordPress-websted lokalt eller kontrollere dine scripts i et miljø som Docker, som giver dig mulighed for at teste forskellige versioner af PHP fra kommandolinjen.

Når PHP 7.4 er frigivet, kan du benytte et scenemiljø på Kinsta, da det ligner et live produktionssite. Opret et scenemiljø med et par enkle klik i MyKinsta dashboard.

WordPress scenemiljø

WordPress scenemiljø

Du skal blot skifte PHP-motoren til scenemiljøet under “Tools”, og du kan begynde at teste for at sikre kompatibiliteten af dine tredjeparts plugins og temaer.

Skift til PHP 7.3

Skift til PHP 7.3

Vi vil tilføje support til PHP 7.4, så snart den er officielt udgivet til Generel tilgængelighed og grundigt testet af vores udviklere. I mellemtiden vil du måske køre dine egne tests med PHP 7.4 på din computer ved hjælp af et værktøj som Docker.

Installation og kørsel af PHP 7.4 på Docker

Heldigvis behøver du ikke at kompilere og konfigurere PHP 7.4 manuelt. Hvis du allerede har Docker installeret på dit system, skal du bare installere det uofficielle PHP-FPM 7.4 Docker-billede og køre dine tests fra kommandolinjen på få sekunder.

Installation af Nginx Docker Image

Installation af Nginx Docker Image

Hvis du foretrækker at køre din PHP 7.4-kode i din browser, skal du også installere et Nginx- eller Apache-billede. Men ingen bekymringer. Bare følg udviklerens anvisninger. Kopier og indsæt kommandoer fra Docker Image-siden til dit kommandolinjeværktøj, og du er klar til at køre.

Resumé

I dette indlæg dækkede vi et stort antal ændringer og tilføjelser, som vi kan forvente med udgivelsen af ​​PHP 7.4. Hvis du leder efter den fulde liste over funktioner sammen med den officielle RFC-dokumentation, skal du tjekke følgende ressourcer:

Vi holder dig opdateret med alle de seneste oplysninger om PHP 7.4 og dens udgivelse.

Er du klar til at teste de kommende PHP-funktioner? Hvilken er din favorit? Del dine tanker med os i kommentarerne nedenfor.

25
Delinger