Vad är nytt i PHP 8.1?

0
150

PHP 8.1 släpptes i november 2021 som den senaste mindre versionen av PHP språk. Den lägger till flera nya språkfunktioner tillsammans med några mindre förbättringar och prestandaförbättringar. Det finns några få förändringar att vara medveten om, men de flesta uppgraderingar från PHP 8.0 bör vara enkla.

Nya funktioner

Årets PHP uppdateringen lägger till flera nya funktioner för att förbättra utvecklarnas produktivitet. Det här är vad du kommer att kunna använda efter att du har uppgraderat.

Enums

Enum-typer är äntligen en del av PHP-språket. De låter dig ange att ett värde måste vara ett av en uppsättning fördefinierade konstanter.

Jämfört med vanliga konstanter ger uppräkningar dig inbyggd validering när de används som metodparametrar och returvärden. De kan också ha stödvärden och metoder som ger extra beteende.

# PHP 8.0 klass PostStatus { const Utkast = 1; const Publicerad = 2; }   # PHP 8.0 – Kan inte ange att värdet # för `$PostStatus` måste definieras # inom `PostStatus`. klass Inlägg { offentlig funktion __konstruera( offentlig sträng $Headline, public int $PostStatus) {} }   # PHP 8.1 enum PostStatus { fall Utkast = 1; fall Publicerad = 2; }   # PHP 8.1 – Nu är det omöjligt att skicka ett # ogiltigt värde som status. klass Inlägg { offentlig funktion __konstruera( offentlig sträng $Headline, public PostStatus $PostStatus) {} }

Läsbara egenskaper

Det nya skrivskyddade nyckelordet markerar en klassegenskap som oföränderlig. Skrivskyddade egenskaper kan bara skrivas till en gång. Om du försöker ändra deras värde efter initiering kommer ett fel uppstå.

Annons

Detta förenklar skapandet av enkla objekt med oföränderligt värde. Tidigare behövde du lägga till repetitiva metoder till en klass om du ville exponera egenskapsvärden utan att tillåta modifiering. Nu kan du göra fastigheterna offentliga utan att riskera oavsiktliga mutationer.

# PHP 8.0 – Detta blir snabbt repetitivt! klass Inlägg { offentlig funktion __konstruera( skyddad sträng $Headline) {}   offentlig funktion getHeadline() : sträng { returnera $this -> Rubrik; } }   # PHP 8.1 klass Inlägg { offentlig funktion __konstruera( offentlig skrivskyddad sträng $Headline) {} }

Korsningstyper

PHP’s typsystem förstår nu korsningar. Dessa låter dig ange att ett värde måste implementera flera gränssnitt.

Detta är användbart i fall där koden behöver anropa instansmetoder som definieras av två olika gränssnitt. Tidigare behövde du skapa ett nytt gränssnitt som utökade båda de önskade. Detta var inte alltid praktiskt i fall där du inte kunde modifiera målklassen för att implementera ditt nya gränssnitt.

Korsningspunkter definieras genom att kombinera två eller flera typer med ett et-tecken. De ger mer flexibilitet till typsystemet efter introduktionen av fackföreningstyper i PHP 8.0. En varning är att du för närvarande inte kan använda korsnings- och fackföreningstyper tillsammans – Countable&Stringable|CustomType är förbjudet i den här utgåvan.

# PHP 8.0-gränssnitt CountableString utökar Countable, Stringable {}   offentlig funktion countAndReport(CountableString $value) : ogiltig { echo "$värde: " . räkna($värde); }   # PHP 8.1 public function countAndReport(Countable&Stringable $value) : ogiltig { echo "$värde: " . räkna($värde); }

Fibrer

Fibrer är en mekanism för att underlätta samtidig utförande. De gör det enklare att implementera återupptagbara kodblock som kan suspenderas från var som helst i stacken.

Fibers API är relativt lågnivå. Det förväntas inte att slutanvändarutvecklare kommer att interagera med den på en regelbunden basis. Istället kommer Fibres att integreras i bibliotek som erbjuder asynkrona API:er och implementeringar av händelseslingor. De är ett kontrollflödessystem som möjliggör förenklade abstraktioner på högre nivå.

Annons

Fibrer erbjuder en väg till asynkrona funktionsanrop som ser ut som vanliga synkrona operationer. Du kan klippa bort pannplattan i samband med löften och återuppringningar. Fibers hanterar avstängning och återupptagande av koden vid lämpliga punkter, och erbjuder ett API för blockerande och icke-blockerande implementeringar av operationer.

# PHP 8.0 – En löftesbaserad HTTP-klient $respons = $httpClient -> begäran("http://example.com") -> använd sedan (Response $Response) { returnera $Response -> getBody(); }); skriv ut $respons;   # PHP 8.1 – En HTTP-klient som använder Fibres internt $respons = $httpClient -> begäran("https://example.com"); print $response -> getBody();

Förstklassiga Callables

Callables är nu förstklassiga medborgare i PHP-språket. Detta innebär att du direkt kan tilldela funktioner till variabler, utan att använda den gamla arraysyntaxen eller explicit stängningsskapande.

Denna förändring kommer att vara mest användbar i funktionella programmeringssammanhang. Att skicka runt funktioner är renare och enklare med direkt variabeltilldelning.

# PHP 8.0 $builtin = Closure::fromCallable("array_filter"); $method = [$this, "getData"];   # PHP 8.1 $builtin = array_filter(…); $method = $this -> getData(…);

Det … som ersätter funktionens parametrar är en obligatorisk del av syntaxen. Detta signalerar att du vill tilldela funktionen till variabeln, istället för att anropa funktionen och tilldela dess returvärde.

Använda New In Initializers

En annan ny funktion är det nya nyckelordet i initializers. Du kan nu använda objektinstanser som standardparametervärden:

# PHP 8.0 klass SendNewsletterAction { skyddad Mailer $Mailer; offentlig funktion __construct(?Mailer $Mailer=null) { $this -> Mailer = $Mailer ?? nya SmtpMailer(); } }   # PHP 8.1 class SendNewsletterAction { offentlig funktion __konstruera( skyddad skrivskyddad Mailer $Mailer=ny SmtpMailer()) {} } Annons

Det nya sökordet kommer också att fungera med statiska variabler, globala konstanter och attributargument. Det ger dig mer flexibilitet och bekvämlighet när du vill ha en objektinstans som standardvärde.

Slutliga klasskonstanter

Det sista nyckelordet stöds nu för klasskonstanter. Du kan markera individuella konstanter som slutgiltiga utan att försegla hela klassen. Tidigare var barnklasser fria att skriva över värdet på konstanter som ärvts från föräldrar.

# PHP 8.0 – Kan inte tillåta detta utan att # göra hela klassen till “slutlig” klass DemoClass { public const DemoConstant = 1; } klass ChildClass utökar DemoClass { public const DemoConstant = 2; }   # PHP 8.1 – Bara konstanten kan vara “slutlig”. klass DemoClass { final public const DemoConstant = 1; } klass ChildClass utökar DemoClass { //Ger ett ödesdigert fel public const DemoConstant = 2; }

Andra

Förutom de stora biljettobjekten som listas ovan, lägger PHP 8.1 också till några bekvämlighetsfunktioner som hjälper till att göra koden mer självdokumenterande. Du kan skriva oktala tal med en explicit notation, såsom 0o14, och använda den nya aldrig return-typen för att beteckna funktioner som kommer att skapa ett undantag eller avsluta det aktuella skriptet. Detta hjälper till att informera om upptäckt av död kod i programvara för statisk analys.

Det finns några nya funktioner i standardbiblioteket. array_is_list() låter dig kontrollera om en array är en lista ([“foo”, “bar”]) eller associativ ([“foo” => “bar”]), vilket ger en inbyggd implementering för en funktion som 8217;s som vanligtvis finns i befintlig användarlandkod. fsync() och fdatasync() låter dig synkronisera filpekarändringar tillbaka till det underliggande lagringsmediet. Natriumstöd för hashalgoritmerna XChaCha20 och Ristretto255 har också lagts till.

Slutligen, den här utgåvan ger möjlighet till prestandaförbättringar. Optimering inklusive en klassarvscache kan ge en gratis prestandaökning på upp till 8 %. Detta skulle vara mest märkbart i tungt objektorienterade kodbaser med många förälder-barn-relationer. PHP kommer nu att cachelagra dessa länkar så att det inte kontinuerligt bygger om dem.

Bakåtinkompatibla ändringar

Som en mindre versionsbump finns det några brytande ändringar och utfasning att vara medveten om innan du uppgraderar. Här är de som mest sannolikt är ett problem i din kodbas:

  • Det är inte längre tillåtet att skriva över $_GLOBALS-matrisen. Du kan fortfarande skriva till enskilda nycklar men kan inte tilldela $_GLOBALS sig själv.
  • Om du utökar en inbyggd klass måste dina åsidosatta metoder deklarera en returtyp som är kompatibel med den ursprungliga. En utfasningsvarning kommer att sändas ut om du anger en inkompatibel typ. Ett #[ReturnTypeWillChange]-attribut stöds för närvarande som ett sätt att undvika detta för bibliotek som behöver stödja flera PHP-versioner.
  • Att skicka null till icke-nullbara parametrar för interna funktioner har fasats ut. Detta var tidigare tillåtet men var oförenligt med typhint-tillämpning för användarskapade funktioner.
  • Implicita casts från int till float har föråldrats – detta påverkar scenarier som $array[10.1], där mantissan kommer att gå förlorad eftersom matriser måste ha heltalsnycklar.
  • Som en del av PHP’s pågående arbete med att ta bort resurstyper, arbetar nu flera funktionsgrupper med nya objekt istället för resurser. Dessa ändringar gäller för FileInfo, FTP, IMAP, LDAP, PgSQL och PSpell API.
  • Funktioner som fungerar med HTML-entiteter som htmlspecialchars() och htmlentities() undkommer nu apostrof som standard, så ' kommer att bli '.
  • Att anropa statiska metoder direkt på egenskaper är föråldrat; du bör anropa metoden på en klass som använder egenskapen istället.

Andra borttagningar och utfasningar påverkar individuella API:er inklusive PDO, MySQLi och Standard. Du bör granska hela migreringsguiden innan du uppgraderar ditt projekt.

Annons

Sammantaget är förändringarna i denna cykel ganska ofarliga. Kodbaser som redan överensstämde med moderna PHP bästa praxis borde inte uppleva för många problem när de flyttar till 8.1. Populära ramverk inklusive Symfony och Laravel stöder redan PHP 8.1 också.

Slutsats

PHP 8.1 lägger till många nya funktioner som gör utvecklingsupplevelsen enklare och mer strömlinjeformad. Enums har länge saknats i typsystemet medan skrivskyddade egenskaper och nya initialiseringsfunktioner kommer att göra det snabbare att skriva nya klasser.

Fibrer hjälper till att göra asynkron PHP mer lättillgänglig medan förstklassiga callables underlättar strömlinjeformad funktion. referenser när man övar på funktionell programmeringsteknik. Alla dessa förändringar utvecklar PHP ytterligare som ett flexibelt språk som erbjuder starka säkerhetsgarantier för din kod samtidigt som det är enkelt att arbeta med.