Eind van dit jaar staat de introductie van PHP 8.0 op de planning. Op 26 november komt de langverwachte opvolger van PHP 7.4 uit.
Wat kunnen we verwachten van PHP 8? Deze major release brengt een hoop verbeteringen met zich mee en vergt van programmeurs dat zij zich verdiepen in de veranderingen die binnen PHP 8 zijn doorgevoerd.
De grootste verandering is misschien wel de JIT-compiler. Over deze en andere belangrijke veranderingen lees je in blogartikel.
Veel van de verbeteringen die we noemen in dit artikel zijn ook terug te vinden op deze website van PHP: https://wiki.php.net/rfc#php_80
Laten we eens inzoomen op een aantal fraaie nieuwe of verbeterde functionaliteiten van PHP 8.
De nieuwe PHP 8 functionaliteiten / verbeteringen die aan bod komen:
- PHP JIT (Just in Time Compiler)
- Union types
- Nullsafe operator
- Attributes
- Nieuwe str_contains() function
- Nieuwe get_debug_type function
- Trailing comma in parameter lists
- Weak Maps
- Consistent type errors
PHP JIT (Just in Time Compiler)
Een van de meest opvallend verbeteringen is de Just in Time Compiler (JIT) van PHP. De JIT-Compiler compileert veelgebruikte stukken code naar geoptimaliseerde machine code.
De JIT compiler belooft prestatieverbeteringen. Hoewel het de prestaties van PHP inderdaad zal gaan verbeteren, zal de eindgebruiker hier niet heel veel van merken.
Het zorgt vooral voor betere prestaties bij numerieke code en een goed alternatief voor problemen die veel intensiteit verlangen van de CPU.
Ook voor de lange termijn heeft JIT voordelen. Doordat code nu van C naar PHP verplaatst kan worden zijn er meer mogelijkheden met PHP en zijn innovaties op dit vlak dichterbij.
Union types
Union Types zijn een verzameling van twee of meer types die aangeven dat van één van deze types gebruik gemaakt zal worden.
Zo kan bv. een methode een parameter hebben wat een object van verschillende classes kan zijn, of een return type dat zowel een string als een boolean kan zijn.
Hoewel het over het algemeen de voorkeur heeft om één type te definiëren, zijn er gevallen waarvoor union types heel goed te pas komen.
In de huidige versies van PHP biedt PHP nog geen ondersteuning voor Union Types. Hier komt met PHP 8 dus verandering in. Wel ondersteunt PHP op dit moment al twee speciale Union Types:
- Type or null, door de speciale
?Type
syntax te gebruiken. - array or Traversable, door de speciale iterable type te gebruiken.
Het ondersteunen van Union Types stelt PHP in staat om meer type-informatie van phpdoc naar functiehandtekeningen te verplaatsen, met de gebruikelijke voordelen die dit met zich meebrengt:
- Typen worden daadwerkelijk afgedwongen, zodat fouten vroegtijdig kunnen worden opgemerkt.
- Omdat ze worden afgedwongen, is de kans kleiner dat typegegevens verouderd raken of randgevallen missen.
- Typen worden gecontroleerd tijdens overerving, waardoor het Liskov-vervangingsprincipe wordt afgedwongen.
- Typen zijn beschikbaar via Reflection.
- De syntaxis is veel minder standaard dan phpdoc.
Met een stemming van 61 tegen 5 werd dit voorstel voor Union Types, binnen de PHP-community, met open armen ontvangen.
Nullsafe operator
De The nullsafe operator die wordt geÏntroduceerd in PHP 8 is een aanvulling op de al beschikbare null coalescing operator. Een van de grootste nadelen van de null coalescing operator is dat het niet werkt in combinatie met methode calls. Je moet dan een aparte check gebruiken om te kijken of een methode geen NULL
teruggeeft.
Met de toevoeging van de nullsafe operator in PHP 8 hebben we nu null coalescing gedrag op methods, zodat een apart check niet meer nodig is.
Attributes
Attributen bieden een manier om metagegevens aan classes toe te voegen zonder dat docblocks uitgelezen hoeven worden.
In PHP 7.4 (en eerdere versies) was de enige manier om metagegevens toe te voegen aan classes, door doc-comments te gebruiken.
Attributes v2 zorgt ervoor dat je dit nu direct kunt toevoegen aan de classes, functies, constanten, etc.
Meer over het gebruik van Attributes v2, vind je op de RFC website.
Nieuwe str_contains() function
Het gebruik van strpos()
is eindelijk niet meer nodig als je wilt weten of een string een andere string bevat.
In plaats van dit:
if (strpos('dit is een hele lange string', 'words') !== false) { /* … */ }
Kun je nu dit doen:
if (str_contains('dit is een hele lange string', 'words')) { /* … */ }
Wel zo handig dus 🙂
Nieuwe get_debug_type function
Nog een nieuwe functie. Dit is een nieuwe functie die het type van een variabele teruggeeft. Deze functie is te vergelijken met de gettype function maar deze nieuwe functie geeft native names terug en zorgt bij class names voor een oplossing.
Bijvoorbeeld: het ingeven van gettype()
op een class \Foo\Bar geeft object terug. Als je get_debug_type()
gebruikt, dan krijg je de class name terug.
Trailing comma in parameter lists
Gebruik van een trailing comma was al mogelijk bij het aanroepen van een functie maar de ondersteuning ontbrak nog steeds in parameter lists. In PHP 8 kan dit nu dus wel.
Weak Maps
Weak Maps maken het mogelijk om een verzameling te maken van objecten met een weak reference. Als een object key garbage collected is, wordt deze eenvoudig van de Map verwijderd.
Op deze manier kun je voorkomen dat referenties blijven bestaan en onnodig geheugen in beslag nemen terwijl deze niet meer beschikbaar hoeven zijn.
Het voorstel binnen RFC was om een WeakMap class toe te voegen met het volgende prototype:
Het voorstel is unaniem aangenomen en meer informatie over WeakMaps vind je uiteraard weer op de RFC-pagina.
Consistent type errors
Vanaf PHP 8 is het gedrag van internal functions consistent gemaakt. Voorheen veroorzaakte door de gebruiker gedefinieerde functies een TypeError, maar internal functions niet. Je kreeg een waarschuwing en het systeem retourneerde null.
PHP 8 zorgt ervoor dat de API’s voor het uitlezen van interne parameters altijd een TypeError genereren als het uitlezen van parameters mislukt.
PHP 8 conclusie
Op de RFC pagina van PHP is te zien dat er nu 44 verbeteringen zijn geaccepteerd voor PHP 8. Teveel om allemaal hier te benoemen, maar we hebben een mooie selectie voor je behandeld.
De JIT-Compiler is er natuurlijk eentje die eruit springt, maar ook Union Types zijn verbeteringen waar wij erg naar uit kijken.
Wil je meer informatie over PHP 8 en écht alle verbeteringen inzien, dan kun je hier terecht.
Een andere goede bron voor alle ontwikkelingen binnen PHP 8 is onderstaande YouTube video van Nikita Popov:
In tegenstelling tot andere major releases is PHP 8 er niet eentje waarvan je extreem veel performance verbeteringen moet verwachten.
In extreme gevallen ligt er nog een performance winst van 10% klaar, maar de meeste verbeteringen zijn met name te vinden in het efficiënter kunnen programmeren.