Wat is er nieuw in PHP 7.4?
De nieuwe minor versie van PHP is eind vorig jaar live gegaan. PHP 7.4 brengt een hoop nieuwe functies en tools met zich mee die het leven van de gemiddelde webdeveloper weer een beetje aangenamer gaan maken. In dit artikel bekijken we nieuwe, aangepaste en verwijderde functionaliteiten in 7.4 en de inmiddels uitgebrachte 7.4.1 en 7.4.2. Ook blikken we alvast vooruit naar PHP 8.0.
PHP 7
PHP is een van de meest populaire programmeertalen ter wereld: zo'n 80% van alle websites gebruikt het in elk geval gedeeltelijk. Dit percentage is grotendeels te danken aan het gebruik van PHP in contentmanagementsystemen zoals Wordpress, Joomla, Drupal en Moodle. De meestgebruikte versie van PHP is op dit moment nog steeds PHP 5.6. Die versie stamt echter alweer uit 2014. Officiële support voor 5.6 is er sinds 1 januari 2019 ook al niet meer. Inmiddels zijn we aangekomen bij versie 7.4, en tussen die twee versies zit een wereld van verschil. Mocht je nog op 5.6 draaien, zou dit wel eens het moment kunnen zijn om te gaan kijken naar een upgrade. PHP 7.4 is de laatste minor versie voordat er weer een major release op stapel staat. PHP 8.0 staat gepland voor eind 2020 of begin 2021.
PHP 7.4 bevat een aantal nieuwe en aangepaste functies en securityupdates. We hebben wat mooie highlights uitgekozen waar wij enthousiast van worden. We bekijken ook van welke functionaliteiten we afscheid gaan nemen. Voor de complete documentatie verwijzen we je uiteraard naar php.net.
Typed properties
PHP ondersteunt voortaan type declarations in class properties. Type declarations voor functies waren al in PHP 7.0 geïmplementeerd, maar in een gelimiteerde vorm. In PHP 7.4 is die functionaliteit uitgebreid naar het propertyniveau binnen een class. Waar je voorheen met getters en setters je types kon controleren, is dit nu veel compacter uit te voeren. Hieronder staan een oud en een nieuw voorbeeld:
class Example
{
/** @var int **/
private $id;
/** @var string **/
private $name;
public function __construct(int $id, string $name)
{
$this->id = $id;
$this->name = $name;
}
public function getId(): int
{
return $this->id;
}
public function setId(int $id): void
{
$this->id = $id;
}
public function getName(): string
{
return $this->name;
}
public function setName(string $name): void
{
$this->name = $name;
}
}
class Example
{
private int $id;
private string $name;
public function __construct(int $id, string $name)
{
$this->id = $id;
$this->name = $name;
}
public function getId(): int
{
return $this->id;
}
public function setId(int $id): void
{
$this->id = $id;
}
public function getName(): string
{
return $this->name;
}
public function setName(string $name): void
{
$this->name = $name;
}
}
PHP 7.4 staat bijna alle typen toe, behalve void en callable. Voor een uitgebreide uitleg verwijzen we je graag naar de RFC op php.net.
Covariant returns en contravariant parameters
Return type declarations zijn een variatie op bovenstaande typed properties: deze geven in de definitie van een functie aan welk type parameter de functie verwacht als returnwaarde. Bij de introductie waren deze declaraties nogal strikt: als er een type gedeclareerd werd bij een functie in een interface, moesten onderliggende classes zich daar ook echt aan houden.
In PHP 7.4 komt hier verandering in. Dankzij covariant returns en contravariant parameters kan een child class een sub- of supertype meegeven als returnwaarde of parameter wanneer de parent-functie wordt overschreven, zonder daar een foutmelding mee te veroorzaken. Voor wie bekend is met Java of C++ zal dit bekend klinken: daar was deze functionaliteit al langer bruikbaar.
De praktische toepassing van deze aanpassing zit hem vooral in de leesbaarheid van je code. Wanneer je werkt met een geavanceerdere IDE, verbeteren dit soort toevoegingen de statische analyse en kunnen problemen nog beter en sneller worden ontdekt.
Lees ook vooral de RFC op php.net over covariant returns en contravariant parameters.
Argument unpacking voortaan ook in arrays
In PHP 5.6 werd argument unpacking geïntroduceerd. Hiermee werd het mogelijk om een array aan een functie mee te geven met de precursor '…', waardoor de waarden van de array als individuele waarden door de functie werden uitgelezen. Dat werkt als volgt:
$testArray = [1,2,3];
$test(0, ...$testArray); // [0,1,2,3]
?>
Het was gelimiteerd tot het toevoegen van arrays aan functieparameters, en kon alleen aan het einde van een parameterlijst gebruikt worden. In PHP 7.4 is deze functionaliteit uitgebreid en mag hij nu ook binnen arrays gebruikt worden:
$groceries = ['apples', 'pears'];
$fruitbowl = ['bananas', 'oranges', ...$groceries, 'grapes'];
// ['bananas', 'oranges', 'apples', 'pears', 'grapes'];
Beter leesbare code dankzij numeric literal separators
Staar je je regelmatig blind op lange nummers? Vanaf 7.4 is het mogelijk om numerieke reeksen op te delen met een underscore. Dit verandert alleen de leesbaarheid voor de developer zelf: tijdens het verwerken van je code worden de underscores weer weggehaald.
$huh = 1000000; // drie keer kijken
$oh = 1_000_000; // het is gewoon 1 miljoen
Let op, deze handige toevoeging werkt weliswaar in alle numerieke notaties, maar heeft wel als voorwaarde dat hij tussen twee cijfers geplaatst wordt. Dit voorbeeld geeft namelijk een parse error:
$nietGoed = aX12b_989;
Arrow functions voor compactere anonieme functies
Arrow functions zijn ontworpen om anonieme functies, of closures, in PHP compacter op te zetten. Voorheen was de opzet van een anonieme functie als volgt:
$example = function($name){printf("Hello %s\r\n", $name);};
$example(“Bob”); // Hello Bob
De compactere vorm hiervan in PHP 7.4 ziet er als volgt uit, maar doet exact hetzelfde:
$example = fn($name) => printf("Hello %s\r\n", $name);
$example(“Bob”); // Hello Bob
Wil je een uitgebreide uitleg van deze nieuwe manier om closures te gebruiken? Dit artikel zet het goed uiteen.
Er zullen ook wat kleine wijzigingen doorgevoerd worden die wellicht geen invloed op jouw code zullen hebben, maar desalniettemin toch even aangestipt moeten worden. Zo wordt de ondersteuning van accolades ( { en } ) in arrays verwijderd. Volgens de RFC is er een inschatting gemaakt dat maar zo'n 0,25% van de datasets daadwerkelijk deze syntax gebruikt in de code. Mocht jij nou net één van de 0,25% zijn, let op dat je je code aanpast.
De functie implode() verwacht twee parameters, $glue en $pieces. Deze mochten altijd in willekeurige volgorde worden meegegeven. Vanaf 7.4 verwacht de functie alleen nog de volgorde implode($glue, $pieces), net als zijn tegenhanger explode(). Wanneer de parameters in de verkeerde volgorde mee worden gegeven, zal er een waarschuwing worden gegeven.
Een andere kleine aanpassing die voor sommige mensen werk zal opleveren, is het verwijderen van de array_key_exists()-functie op objecten. Hiervoor zal voortaan isset() of property_exists() gebruikt moeten worden.
De volledige lijst met deprecations of verwijderde functies is hier te vinden.
Wachten op 8.0
PHP 8.0 is inmiddels ook aangekondigd, met een verwachte releasedatum van eind 2020 of begin 2021. Één van de belangrijkste aankondigingen voor 8.0 lag oorspronkelijk al op de plank voor 7.4: JIT, of “Just In Time” compilation. PHP is van nature geen gecompileerde programmeertaal, in tegenstelling tot C of Java. In plaats daarvan wordt het geïnterpreteerd door de engine en omgezet naar machine code. Dit heeft als voordeel dat er geen opstartperiode is en de code meteen gerund kan worden. Daarentegen betekent het wel dat het nooit een buffer opbouwt, zoals in Java gebeurt. Met zo'n buffer kan de engine terugvallen op code die al vaker gebruikt is en de al gecompileerde code zo hergebruiken.
Tussen PHP 5 en PHP 7 zat al een grote performanceverbetering omdat men toen al voorbereidingen had getroffen voor de mogelijke implementatie van JIT. Sindsdien zijn er in elke minor versie aanpassingen gemaakt die de performance nog meer ten goede zijn gekomen, maar veel meer ruimte voor verbetering is er niet meer. Het development team van PHP is van mening dat PHP nu echt klaar is voor de implementatie van JIT als de volgende stap in de verbetering van de performance. Het zou de programmeertaal daarnaast ook interessanter maken voor andere, CPU-intensieve scenario’s waar PHP in zijn huidige staat niet eens voor in aanmerking zou komen.
Handmatig je VPS updaten
Maar voor het zover is, kunnen we aan de bak met PHP 7.4. Uiteraard hebben we hier nog niet alle updates besproken, anders was dit artikel misschien wel drie keer zo lang. De volledige lijst met RFC's die zijn geïmplementeerd in 7.4 is hier te vinden. Mocht je ermee aan de slag willen, is het zeker de moeite waard om de release notes door te pluizen. Controleer ook voor je update of een overstap naar de nieuwe versie geen problemen oplevert met processen op je server of met andere software. Onze Knowledge Base bevat een uitgebreide lijst met handleidingen waarmee je jouw VPS gemakkelijk kunt updaten.
Maar voel je niet opgejaagd om zo snel mogelijk te updaten: PHP 7.2 wordt nog tot 30 november 2020 ondersteund, en 7.3 nog tot 6 december 2021. En ben je Webhostingklant bij TransIP, goed nieuws: onze Webhosting-servers zijn ook klaar voor het gebruiken van PHP 7.4 op jouw omgeving.
Bedankt voor het toelichten!