Wat is er nieuw in PHP 8.1?

0
54

PHP 8.1 werd in november 2021 uitgebracht als de nieuwste secundaire versie van de PHP taal. Het voegt verschillende nieuwe taalfuncties toe, naast enkele kleinere verbeteringen en prestatieverbeteringen. Er zijn een paar belangrijke wijzigingen waar u rekening mee moet houden, maar de meeste upgrades vanaf PHP 8.0 zouden eenvoudig moeten zijn.

Nieuwe functies

PHP van dit jaar update voegt verschillende nieuwe functies toe om de productiviteit van ontwikkelaars te verbeteren. Dit is wat je kunt gebruiken nadat je een upgrade hebt uitgevoerd.

Enums

Enum-typen maken eindelijk deel uit van de PHP-taal. Ze laten je specificeren dat een waarde een van een set vooraf gedefinieerde constanten moet zijn.

Vergeleken met reguliere constanten, bieden enums u ingebouwde validatie wanneer ze worden gebruikt als methodeparameters en retourwaarden. Ze kunnen ook ondersteunende waarden en methoden hebben die extra gedrag koppelen.

# PHP 8.0 klasse PostStatus { const Diepgang = 1; const Gepubliceerd = 2; }   # PHP 8.0 – Kan niet typen dat de waarde # van `$PostStatus` moet worden gedefinieerd # binnen `PostStatus`. klasse Bericht { publieke functie __construct( public string $Headline, public int $PostStatus) {} }   # PHP 8.1 opsomming PostStatus { geval Ontwerp = 1; zaak Gepubliceerd = 2; }   # PHP 8.1 – Het is nu onmogelijk om een ​​# ongeldige waarde als status door te geven. klasse Bericht { publieke functie __construct( openbare string $Headline, public PostStatus $PostStatus) {} }

Readonly-eigenschappen

Het nieuwe readonly-sleutelwoord markeert een class-eigenschap als onveranderlijk. Alleen-lezen eigenschappen kunnen slechts één keer worden geschreven. Als u hun waarde probeert te wijzigen na initialisatie, krijgt u een foutmelding.

Advertentie

Dit vereenvoudigt het creëren van eenvoudige onveranderlijke waarde-objecten. Voorheen moest u repetitieve methoden aan een klasse toevoegen als u eigenschapswaarden wilde weergeven zonder wijziging toe te staan. Nu kunt u de eigenschappen openbaar maken zonder het risico te lopen op onbedoelde mutaties.

# PHP 8.0 – Dit wordt snel repetitief! klasse Bericht { publieke functie __construct( beveiligde tekenreeks $Headline) {}   publieke functie getHeadline() : tekenreeks { retourneer $this -> kop; } }   # PHP 8.1 klasse Post { publieke functie __construct( openbare alleen-lezen tekenreeks $Headline) {} }

Intersectietypes

Het typesysteem van PHP begrijpt nu kruispunten. Hiermee kunt u specificeren dat een waarde meerdere interfaces moet implementeren.

Dit is handig in gevallen waarin code instantiemethoden moet aanroepen die zijn gedefinieerd door twee verschillende interfaces. Voorheen moest u een nieuwe interface maken die beide gewenste uitbreidde. Dit was niet altijd praktisch in gevallen waarin u de doelklasse niet kon wijzigen om uw nieuwe interface te implementeren.

Intersecties worden gedefinieerd door twee of meer typen te combineren met een ampersand-teken. Ze voegen meer flexibiliteit toe aan het typesysteem na de introductie van union-types in PHP 8.0. Een waarschuwing is dat u momenteel geen kruisings- en vakbondstypen samen kunt gebruiken – Countable&Stringable|CustomType is verboden terrein in deze release.

# PHP 8.0-interface CountableString breidt Countable, Stringable {}   publieke functie countAndReport(CountableString $value) : ongeldig { echo "$waarde: " . tellen($waarde); }   # PHP 8.1 openbare functie countAndReport(Countable&Stringable $value) : ongeldig { echo "$waarde: " . tellen($waarde); }

Vezels

Vezels zijn een mechanisme om gelijktijdige uitvoering te vergemakkelijken. Ze maken het gemakkelijker om hervatbare codeblokken te implementeren die overal in de stapel kunnen worden opgehangen.

De Fibers API is relatief laagdrempelig. Het is niet te verwachten dat ontwikkelaars van eindgebruikers er regelmatig mee zullen werken. In plaats daarvan zal Fibers worden geïntegreerd in bibliotheken die asynchrone API's en event loop-implementaties bieden. Het is een controlestroomsysteem dat vereenvoudigde abstracties op een hoger niveau mogelijk maakt.

Advertentie

Fibers bieden een pad naar asynchrone functieaanroepen die eruitzien als normale synchrone bewerkingen. U kunt de standaardtekst verwijderen die hoort bij beloften en terugbellen. Fibers zorgt voor het opschorten en hervatten van de code op de juiste punten en biedt één API voor het blokkeren en niet-blokkeren van implementaties van bewerkingen.

# PHP 8.0 – Een op belofte gebaseerde HTTP-client $response = $httpClient -> verzoek("http://example.com") -> dan (functie (Response $Response) { retourneer $Response -> getBody(); }); druk $antwoord af;   # PHP 8.1 – Een HTTP-client die Fibers intern gebruikt $response = $httpClient -> verzoek("https://example.com""; print $respons -> getBody();

First-Class Callables

Callables zijn nu eersteklas burgers in de PHP-taal. Dit betekent dat u functies direct aan variabelen kunt toewijzen, zonder de oude array-syntaxis te gebruiken of expliciete sluitingen te maken.

Deze wijziging zal het nuttigst zijn in functionele programmeercontexten. Het doorgeven van functies is schoner en gemakkelijker met directe variabele toewijzing.

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

De … die de parameters van de functie vervangt, is een verplicht onderdeel van de syntaxis. Dit geeft aan dat u de functie aan de variabele wilt toewijzen, in plaats van de functie aan te roepen en de retourwaarde toe te wijzen.

Nieuwe initialen gebruiken

Een andere nieuwe functie is het nieuwe sleutelwoord in initializers. U kunt objectinstanties nu als standaardparameterwaarden gebruiken:

# PHP 8.0 klasse SendNewsletterAction { beveiligde Mailer $Mailer; publieke functie __construct(?Mailer $Mailer=null) { $dit -> Mailer = $Mailer ?? nieuwe SmtpMailer(); } }   # PHP 8.1 klasse SendNewsletterAction { publieke functie __construct( beveiligde alleen-lezen mailer $Mailer=nieuwe SmtpMailer()) {} } Advertentie

Het nieuwe zoekwoord werkt ook met statische variabelen, globale constanten en attribuutargumenten. Het geeft u meer flexibiliteit en gemak wanneer u een objectinstantie als standaardwaarde wilt.

Final Class Constants

Het laatste sleutelwoord wordt nu ondersteund voor klasseconstanten. U kunt afzonderlijke constanten als definitief markeren zonder de hele klasse af te sluiten. Voorheen waren kinderklassen vrij om de waarde van constanten te overschrijven die van ouders werden geërfd.

# PHP 8.0 – Kan dit niet weigeren zonder # de hele klasse `final` class DemoClass { openbare const DemoConstante = 1; } class ChildClass breidt DemoClass uit { openbare const DemoConstante = 2; }   # PHP 8.1 – Alleen de constante kan `final` zijn. klasse DemoClass { uiteindelijke openbare const DemoConstant = 1; } class ChildClass breidt DemoClass uit { //Geeft een fatale fout public const DemoConstant = 2; }

Overige

Naast de hierboven genoemde grote ticketitems, voegt PHP 8.1 ook een paar handige functies toe die helpen om code meer zelfdocumenterend te maken. U kunt octale getallen schrijven met een expliciete notatie, zoals 0o14, en het nieuwe never return-type gebruiken om functies aan te duiden die een uitzondering veroorzaken of het huidige script afsluiten. Dit helpt bij het detecteren van dode code in statische analysesoftware.

Er zijn een paar nieuwe functies in de standaardbibliotheek. array_is_list() laat je controleren of een array een lijst ([“foo”, “bar”]) of associatief ([“foo” => “bar”]) is, en biedt een ingebouwde implementatie voor een functie die 8217;s die vaak worden aangetroffen in bestaande gebruikerscode. Met fsync() en fdatasync() kunt u wijzigingen in de bestandsaanwijzer terug synchroniseren naar de onderliggende opslagmedia. Natriumondersteuning voor de hash-algoritmen XChaCha20 en Ristretto255 is ook toegevoegd.

Ten slotte biedt deze release het vooruitzicht van prestatieverbeteringen. Optimalisaties, waaronder een klasse-overnamecache, kunnen een gratis prestatieverbetering tot 8% opleveren. Dit zou het meest opvallen in zwaar objectgeoriënteerde codebases met veel ouder-kindrelaties. PHP slaat deze links nu in de cache op, zodat ze niet voortdurend opnieuw worden opgebouwd.

Backwards incompatibele wijzigingen

Als een kleine versie-bump, zijn er een paar belangrijke wijzigingen en afschaffing waarvan u op de hoogte moet zijn voordat u een upgrade uitvoert. Dit zijn de meest waarschijnlijke problemen in uw codebase:

  • Het overschrijven van de $_GLOBALS-array is niet langer toegestaan. U kunt nog steeds naar afzonderlijke sleutels schrijven, maar u kunt $_GLOBALS zelf niet opnieuw toewijzen.
  • Als u een ingebouwde klasse uitbreidt, moeten uw overschreven methoden een retourtype declareren dat compatibel is met de originele. Er wordt een afschrijvingswaarschuwing gegeven als u een incompatibel type opgeeft. Het kenmerk #[ReturnTypeWillChange] wordt momenteel ondersteund als een manier om dit te voorkomen voor bibliotheken die meerdere PHP-versies moeten ondersteunen.
  • Het doorgeven van null aan niet-nullable parameters van interne functies is verouderd. Dit was eerder toegestaan, maar was niet consistent met het afdwingen van typehint voor door de gebruiker gemaakte functies.
  • Impliciete casts van int naar float zijn verouderd – dit is van invloed op scenario's zoals $array[10.1], waarbij de mantisse verloren gaat omdat arrays integer-sleutels moeten hebben.
  • Als onderdeel van PHP's voortdurende werk om resourcetypes te verwijderen, werken verschillende functiegroepen nu met nieuwe objecten in plaats van resources. Deze wijzigingen zijn van toepassing op de FileInfo-, FTP-, IMAP-, LDAP-, PgSQL- en PSpell-API's.
  • Functies die werken met HTML-entiteiten zoals htmlspecialchars() en htmlentities() ontsnappen nu standaard aan apostrofs, dus ' wordt '.
  • Het rechtstreeks aanroepen van statische methoden voor eigenschappen is verouderd; je moet de methode aanroepen op een klasse die in plaats daarvan de eigenschap gebruikt.

Andere verwijderingen en beëindigingen zijn van invloed op afzonderlijke API's, waaronder PDO, MySQLi en Standard. U dient de volledige migratiehandleiding door te nemen voordat u uw project opwaardeert.

Advertentie

Alles bij elkaar genomen zijn de wijzigingen van deze cyclus vrij onschuldig. Codebases die al in overeenstemming waren met moderne PHP-best practices, zouden niet al te veel problemen moeten ondervinden bij het overstappen naar 8.1. Populaire frameworks, waaronder Symfony en Laravel, ondersteunen ook al PHP 8.1.

Conclusion

PHP 8.1 voegt veel nieuwe functies toe die de ontwikkelervaring eenvoudiger en meer gestroomlijnd maken. Enums zijn lange tijd een ontbrekend onderdeel geweest van het type systeem, terwijl alleen-lezen eigenschappen en nieuw in initializers het sneller zullen maken om nieuwe klassen te schrijven.

Vezels helpen om asynchrone PHP toegankelijker te maken, terwijl eersteklas aanroepbare functies een gestroomlijnde functie vergemakkelijken referenties bij het oefenen van functionele programmeertechnieken. Al deze veranderingen maken PHP verder volwassen als een flexibele taal die sterke veiligheidsgaranties biedt voor je code en toch eenvoudig is om mee te werken.