PHP 7.2 is officieel gelanceerd per 30 november. De nieuwe versie heeft nieuwe features, functies en verbeteringen dat ons instaat stelt betere code te schrijven. In deze blog zal ik een aantal van de meest interessante taal features met PHP 7.2 introduceren.

Bijwerken: PHP 8.0 is nu beschikbaar voor alle Kinsta clients.

Je kunt een complete lijst met veranderingen zien op de Requests For Comments pagina.

Kern verbeteringen

Argument type declaraties

Sinds PHP 5 is het mogelijk om binnen een functie declaratie te specificeren welk type argument er verwacht wordt door de functie. Indien de waarde van een incorrect type is dan geeft PHP een error terug.

Argument type declaraties (ook bekend als type hints) specificeren het type van de variabele dat wordt verwacht door de functie of class methode.

Hieronder staat een voorbeeld:

class MyClass {
	public $var = 'Hello World';
}

$myclass = new MyClass;

function test(MyClass $myclass){
	return $myclass->var;
}

echo test($myclass);

In deze code verwacht de test functie een instantie van MyClass. Een fout data type zou resulteren in de volgende fatal error:

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of MyClass, string given, called in /app/index.php on line 12 and defined in /app/index.php:8

PHP 7.2 staat toe dat type hints gebruikt wordt met het object data type. Deze verbetering staat het declareren van een algemeen object als argument voor een functie of methode toe. Hier is een voorbeeld:

class MyClass {
	public $var = '';
}

class FirstChild extends MyClass {
	public $var = 'My name is Jim';
}
class SecondChild extends MyClass {
	public $var = 'My name is John';
}

$firstchild = new FirstChild;
$secondchild = new SecondChild;

function test(object $arg) {
	return $arg->var;
}

echo test($firstchild);

echo test($secondchild);

In dit voorbeeld hebben we de test functie twee keer aangeroepen, elke keer met een ander object. Dit was niet mogelijk in voorgaande PHP-versies.

Docker commandos
Type hints testen met PHP 7.0 en PHP 7.2 in Docker

Object return type declaraties

Als argument type declaraties het verwachtte type voor een functie argument specificeren dan specificeert de return type declaratie het verwachtte type van de variabele dat teruggegeven wordt door een functie.

Return type declaratie specificeert het type van de variabele dat naar verwachting terug wordt gegeven door een functie.

Vanaf PHP 7.2 is het toegestaan om om gebruik te maken van het object data type. Hieronder staat een voorbeeld:

class MyClass {
	public $var = 'Hello World';
}

$myclass = new MyClass;

function test(MyClass $arg) : object {
	return $arg;
}

echo test($myclass)->var;

Voorgaande PHP-versies weergeven de volgende fatal error:

Fatal error: Uncaught TypeError: Return value of test() must be an instance of object, instance of MyClass returned in /app/index.php:10

Uiteraard, in PHP 7.2 zou deze code “Hello World” weergeven.

Parameter type verbreding

Op dit moment staat PHP geen enkele variatie van parameter types tussen child classes en hun parent classes of interfaces toe. Wat betekend dit?
Neem de volgende code in acht:

<?php
class MyClass {
	public function myFunction(array $myarray) { /* ... */ }
}

class MyChildClass extends MyClass {
	public function myFunction($myarray) { /* ... */ }
}

Hier hebben we de parameter type weg gelaten in de subclass. In PHP 7.0 zou deze code de volgende waarschuwing geven:

Warning: Declaration of MyChildClass::myFunction($myarray) should be compatible with MyClass::myFunction(array $myarray) in %s on line 8

Sinds PHP 7.2 is het toegestaan om het type weg te laten in de subclass zonder dat de code breekt. Dit stelt ons in staat om classes te upgraden met type hints in libraries zonder dat we verplicht zijn alle subclasses te updaten.

Achterliggende komma in lijst syntaxis

De achterliggende komma na het laatste item in arrays is correcte syntaxis in PHP en in sommige gevallen wordt het aangemoedigd om gemakkelijk nieuwe items toe te voegen en parse fouten door missende komma te voorkomen. Sinds PHP 7.2 is het toegestaan om achterliggende komma’s te gebruiken in gegroepeerde namespaces.

Bekijk Achterliggende komma’s in lijst syntaxis voor een beter zicht op dit op RFC en een aantal voorbeelden van code.

Veiligheid verbeteringen

Argon2 in wachtwoord hash

Argon2 is een krachtig hashing algoritme dat als winner is geselecteerd van de 2015 Password Hashing competitie, PHP 7.2 maakt het beschikbaar voor ons als veilig alternatief voor het Bcrypt algoritme. De nieuwe PHP versie introduceert de PASSWORD_ARGON2l constante, dat gebruikt kan worden in password_* functies:

password_hash('password', PASSWORD_ARGON2I);

Anders dan Bcript, welke maar 1 cost factor nodig heeft, gebruikt Argon2 drie cost factoren:

  • Een geheugen cost, welke het aantal KiB dat verbruikt moet worden gedurende het versleutelen definieert (standaardwaarden zijn 1<<10, 1024KiB of 1 MiB)
  • Een tijd cost, welke het aantal iteraties van het algoritme definieert (standaard 2)
  • Een parallel factor, welke het aantal gelijktijdige threads die gebruikt worden gedurende de versleuteling definieert (standaard 2)

Drie nieuwe constante definiëren de standaard cost factoren:

  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST
  • PASSWORD_ARGON2_DEFAULT_TIME_COST
  • PASSWORD_ARGON2_DEFAULT_THREADS

Hier een voorbeeld:

$options = ['memory_cost' => 1< 4, 'threads' => 2];
password_hash('password', PASSWORD_ARGON2I, $options);

Bekijk Argon2 Password Hash voor meer informatie.

Libsodium as part of PHP Core

Vanaf versie 7.2 bevat de PHP kern Sodium library. Libsodium is een cross-platform en cross-language library voor encriptie, decryptie, handtekeningen, wachtwoord hashing en meer. De library was voorheen beschikbaar via PECL. Voor een gedocumenteerde lijst van libsodium functies, bekijk de library Snel start gids. Bekijk ook de  PHP 7.2: The First Programming Language to Add Modern Cryptography to its Standard Library.

Afschaffingen

Hier is een lijst van PHP 7.2 afgeschafte functies en features die verwijderd zullen worden in PHP 8.0:

De auto_load functie is vervangen door de spl_autoload_register in PHP 5.1. Er wordt nu een afschaffing bericht gegeven als deze functie voorkomt tijdens compileren.

De $php_errormsg variabele wordt aangemaakt in de lokale scope wanneer er een niet-fatale error voorkomt. Sinds PHP 7.2 zouden error_get_last en error_clear_last gebruikt moeten worden.

Create_function() staat toe een functie met een gegenereerde naam aan te maken met een lijst van argumenten en body code als argumenten. Door de veiligheidsrisico’s en de slechte prestaties is het gemarkeerd als afgeschaft en het gebruik van enclosures wordt aangemoedigd.

Mbstring.func_overload ini instellingen ingesteld op een niet 0 waarde is gemarkeerd als afgeschaft.

(unset) cast is een expressie die altijd null teruggeeft en word als nutteloos gezien.

Parse_str() ontleed een query string in een array als het tweede argument is gegeven of in een lokale symbool tabel als dit niet het geval is. Aangezien het dynamisch instellen van variabelen in de scope van een functie wordt ontmoedigd vanwege veiligheidsredenen zal het gebruik van parse_str() zonder het tweede argument een afschaffing bericht weergeven.

Gmp_random() wordt gezien als platform afhankelijk en wordt daarom gemarkeerd als deprecated. Gebruik gmp_random_bits() en gmp_random_rage().

each() wordt gebruikt om over een array te itereren zoals bijvoorbeeld foreach(), maar foreach() heeft de voorkeur vanwege meerdere redenen, waaronder het 10x sneller zijn. Nu wordt een afschaffing bericht weergegeven tijdens het eerste verzoek in een loop.

De assert() functie checkt de ingevoerde bewerking en kiest de juiste acties indien het resultaat FALSE is. Het gebruik van assert() met een string als argument is nu afgeschaft aangezien het een RCE kwetsbaarheid blootlegt. De zend.assertion ini optie kan worden gebruikt om

$errcontext is een array die de lokale variabelen bevat op het moment dat een error wordt gegenereerd. Het wordt meegegeven als laatste argument aan de error verwerkers met de set_error_handler() functie.

Wat betekend PHP 7.2 voor WordPress gebruikers?

Volgens de officiële WordPress Statistieken pagina, op moment van schrijven, heeft maar 19,8% van de WordPress gebruikers geüpgraded naar PHP 7 en alleen 5% maakt gebruik van PHP 7.1. Je kan zien dat een groot gedeelte van de gebruikers, meer dan 40%, nog steeds draaien op PHP 5.6. Wat nog enger is, 39% van de gebruikers maken gebruik van een niet ondersteunde PHP-versie. Vanaf December 2016 heeft WordPress hun officiële aanbeveling verhoogt van PHP 5.6 naar PHP 7 of hoger.

WordPress PHP 7.1 statistieken
WordPress PHP 7.1 statistieken

De cijfers die hierboven staan zijn extra ontmoedigend als we kijken vanuit de prestatie perspectief, aangezien PHP 7 heeft laten zien significant sneller te zijn. Hieronder een paar statistieken:

  • Officiële PHP benchmarks laten zien dat PHP 7 het systeem toestaat om twee keer zoveel verzoeken uit te voeren ten opzichte van PHP 5.6 met bijna de helft van de latency.
  • Christian Vigh heeft ook een PHP prestatie vergelijking gepubliceerd waarin hij ontdekte dat PHP 5.2 400% langzamer is dan PHP 7.

Wij hebben ook onze eigen prestatie benchmarks gedaan in 2018 met PHP 5.6 vs PHP 7 vs HHVM. Vergelijkbaar met de benchmarks van hierboven, zagen wij dat PHP 7.2 bijna 3 keer zoveel transacties (verzoeken) per seconde kon uitvoeren ten opzichte van PHP 5.6

WordPress benchmarks
WordPress benchmarks
  • WordPress 4.9.4 PHP 5.6 benchmark resultaat: 49.18 req/sec
  • WordPress 4.9.4 PHP 7.0 benchmark resultaat: 133.55 req/sec
  • WordPress 4.9.4 PHP 7.1 benchmark resultaat: 134.24 req/sec
  • WordPress 4.9.4 PHP 7.2 benchmark resultaat148.80 req/sec ?
  • WordPress 4.9.4 HHVM benchmark resultaat: 144.76 req/sec

Het updaten wordt vaak uitgesteld vanwege de tijd die het kost voor het testen van alle externe plugins en thema’s om er zeker van te zijn dat ze op een juiste manier werken. Maar nog vaker komt het er simpelweg op neer dat gebruikers het gewoon nog niet gedaan hebben. Weet je niet zeker welke PHP versie jij gebruikt? Een van de gemakkelijkste manieren om te controleren is gebruik maken van een hulpmiddel als Pingdom of Google Chrome Devtools. De eerste HTTP request header laat je meestal zien welke versie jij gebruikt.

Controleer PHP versie
Controleer PHP versie

Dit is afhankelijk van het niet aanpassen van de X-Powered-By header waarde door de host. Indien ze dat wel doen, dan zie je mogelijk niet welke PHP versie gebruikt wordt. In dat geval kun je een bestand via FTP uploaden of contact opnemen met de host en het gewoon vragen.

Updaten naar PHP 7.2

PHP 7.2 is nog niet beschikbaar maar wanneer dat zo is dan kun je beginnen met testen. Je zou jouw WordPress website lokaal kunnen testen of je kunt jouw scripts controleren in een omgeving als Docker, deze staat toe om verschillende PHP versies vanuit de command line te testen.

Je kunt ook gebruik maken van een test omgeving, aangezien deze het meest lijkt op een live productie site. Kinsta heeft PHP 7.2 voor alle klanten beschikbaar gemaakt op 4 December 2017. Je kunt met 1 druk op de knop gemakkelijk een test omgeving opzetten.

Test PHP 7.2 in staging omgeving
Test PHP 7.2 in staging omgeving

Klik op verander de PHP engine voor de test omgeving onder “Hulpmiddelen” en je kan beginnen met testen om compatibiliteit van de externe plugins en thema’s te verzekeren. Wanneer je hebt bevestigd dat alles werk dan kun je de productie website overzetten naar PHP 7.2 of je test omgeving naar de live omgeving pushen.

Wijzig in PHP 7.2
Wijzig in PHP 7.2

Conclusies

Ben jij er klaar voor om over te stappen op PHP 7.2? Hopelijk, heb je tenminste de switch gemaakt naar PHP 7. Heb je dat nog niet gedaan, dan is nu een goed moment om te beginnen met testen. Dus, upgrade je scripts, controleer je code en laat ons jouw eerste indrukken van PHP 7.2 weten.

Aanbevolen artikel: Is PHP dood?

Carlo Daniele Kinsta

Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.