terug naar blogs

PHP 8.2: Nieuwe features, deprecrations en breaking changes

Afbeelding voor PHP 8.2: Nieuwe features, deprecrations en breaking changes
avatar van Danny
auteur
Danny
auteur
avatar van Danny
Danny
PHP 8.2
4 januari 2023 leestijd 7-10 minuten

PHP is een geweldige programmeertaal voor het maken van dynamische websites of applicaties. Het wordt goed onderhouden en jaarlijks komt er een nieuwe versie uit. De nieuwste versie, PHP 8.2, is 8 december uitgekomen.
Omdat wij het belangrijk vinden op de nieuwste versies te draaien kunnen onze klanten deze versie sinds 13 december gebruiken. In deze blog bespreken we een stappenplan voor het veilig updaten van PHP voor developers, de belangrijkste nieuwe features, deprecated functies en breaking changes.

Afbeelding voor

Vragen of opmerken over deze blog?

Wat gebeurt er nu PHP 8.2 uit is?

Met de komst van PHP 8.2 is er een eind gekomen aan de PHP 7.x versies. Ook PHP 7.4 wordt niet meer ondersteund door PHP. Dit houdt in, wanneer er een bug of security issue naar voren komt, dat PHP dit niet meer voor de 7.4 en lagere versies zal oplossen. Hierdoor kan jouw website of applicatie kwetsbaar worden voor hackers.

Wij raden aan om minimaal aan de oudste nog ondersteunde PHP versie te voldoen. Voldoen aan de laatste PHP versie is het aller fijnste om te doen. Eerlijk is eerlijk, een versie upgrade van PHP kan het een en ander aan werk voor je betekenen. Je website of applicatie kan ineens niet meer werken. Of je krijgt flink wat deprecation meldingen van PHP functionaliteiten die bij de eerste volgende grote PHP upgrade (bijvoorbeeld PHP 9) worden verwijderd.

Hoe kan je veilig naar PHP 8.2 upgraden? (Developers)

De allereerste keer dat je een upgrade gaat uitvoeren zul je wat meer werk hebben. Wanneer je packages up to date zijn en je bekend bent met tools als PHP Compatibility Coding: Standard for PHP CodeSniffer en Rector, zullen de opvolgende PHP upgrades een stuk makkelijker zijn. In dit stappenplan gaan we uit van een applicatie die middels deployment beheerd wordt en gebruik maakt van een development, staging, acceptatie en productie omgeving.

Hoe kan je veilig naar PHP 8.2 upgraden?

Binnen ons eigen platform Projects is het mogelijk om de PHP versie per project aan te passen met een dropdown menu in het controle paneel. Houd er rekening mee dat je dit altijd eerst op een acceptatie of staging omgeving test voordat je dit op een productie omgeving probeert.

Nieuwe Features in PHP 8.2

Bij elke PHP update worden er meerdere features en functies toegevoegd, aangepast en geupdate. We maken in onze blog een selectie van de meest belangrijke veranderingen op basis van de impact die ze hebben. Ben je benieuwd naar de hele lijst? Kijk dan naar de RFC op de PHP wiki website.

Verberg parameters in back traces

Wanneer je een monitoring of debugging tool gebruikt dan stuur je in de meeste gevallen je error log of stack traces door naar een derde partij. In sommige gevallen kan daarbij gevoelige informatie zoals wachtwoorden of usernames plain tekst verstuurt worden. Dit is uiteraard niet veilig. In PHP 8.2 is het mogelijk om bepaalde parameters als gevoelig te kenmerken middels de #[\SensitiveParameter] zodat deze niet zichtbaar terug gestuurd worden.

Nieuwe random extensie

In PHP 8.2 is er een nieuwe willekeurig getal generator beschikbaar. Deze biedt enkele grote verbeteringen ten opzichte van de vorige; betere performance, veiliger, makkelijker bij te houden en is niet afhankelijke van een global state. Dit was voorheen de oorzaak van enkele bugs bij het gebruik van deze generator.

Er is daarbij een nieuwe class beschikbaar Randomizer . Deze kan gebruikt worden om een random engine toe te wijzen. Zo kan je dit bijvoorbeeld gebruikt worden om verschil te maken tussen productie en ontwikkeling.

$rng = $is_production

? new Random\Engine\Secure() 
: new Random\Engine\Mt19937(1234); 

$randomizer = new Random\Randomizer($rng);
$randomizer->shuffleString('foobar');

Read Only Classes

In PHP 8.1 werd het mogelijk om class attributen als ReadOnly te declaren. In PHP 8.2 is het mogelijk gemaakt om een hele class als ReadOnlyin te stellen. Hierdoor hoeft ieder individueel attribuut met php 8.2 niet meer apart te worden aangemerkt.

class Post { 
    public function __construct( 
        public readonly string $title, 
        public readonly Author $author,
        public readonly string $body,
        public readonly DateTime $publishedAt,
    ) {} 
}


In PHP 8.2 kan dit voor de hele class gedaan worden.

readonly class Post { 
    public function __construct(
        public string $title,
        public Author $author,
        public string $body,
        public DateTime $publishedAt, 
    ) {} 
}

Deprecated functies in PHP 8.2

Deprecated functies zijn geen nieuwe features maar waarschuwingen. Daarom is het belangrijk deze niet te negeren. Deze kunnen bijvoorbeeld aangeven dat functie niet meer wordt aangeraden omdat er een beter alternatief is. Maar ook dat een functie niet meer wordt ondersteund. Dit wordt aangegeven voor de huidige PHP versie en ook voor toekomstige updates. Deprecation waarschuwingen zijn daarom niet direct een probleem maar een waarschuwing om je code op tijd aan te passen voordat het mogelijk een probleem wordt.

Afbeelding voor

Wil jij ook op de nieuwste PHP versie draaien?

Dynamic properties

Dynamic properties gaan mogelijk het grootste struikelblok worden voor oudere applicaties die in de toekomst naar PHP 9.0 moeten upgraden. In PHP 9.0 vervalt het dynamisch declaren van properties. Dit wil zeggen dat vanaf PHP 9.0 er een fatal error zal ontstaan als dit nog gebruikt wordt in je code. In PHP 8.2 zal je hier een deprecated waarschuwing voor krijgen. Feitelijk betekent dit dat alle properties (met enkele uitzonderingen) op voorhand in de class gedefinieerd moeten worden. Voorheen mocht dit middels dynamische properties ook buiten de class gedaan worden. Hierdoor kunnen de declaraties door de code heen verstopt staan in plaatst van bij de class zelf. Het probleem daarmee was dat er fouten konden ontstaan in de code en de debugging lastig werd.

class Post { 
    public string $title; 
} 
// … 
$post->name = 'Name';

In PHP 8.2 zal dit eerst gedeclareerd moeten worden.

class Post { 
    private array $properties = [ ]; 
    public function __set(string $name, mixed $value): 
    void { 
        $this->properties[$name] = $value;
    }
}
// …
$post->name = 'Name';

Uitzonderingen
De properties die worden opgehaald via de Magic Methods van PHP zoals __get() en __set() worden niet gezien als dynamische properties en worden dus niet gezien als deprecated. Er is daarnaast ook een nieuwe mogelijkheid om een class te markeren met #[AllowDynamicProperties] deze classes en onderliggende child-classes blijven dan gebruik maken van dynamisch properties.

utf8_encode() en utf8_decode() 

Deze twee functies komen te vervallen in PHP 9.0 en zijn vanaf PHP 8.2 deprecated. De reden is dat de functie vaak verkeerd begrepen werd als algemene decoder terwijl deze alleen gebruikt kon worden om van Latin-1 naar UTF8 te encode en decode. De voorgestelde vervanger is mb_convert_encoding .

${} string interpolation

Er zijn binnen PHP meerdere manieren om een variabel in een string te embedden. Twee minder gebruikte methodes komen te vervallen bij deze update.

"Hello ${world}"; 
"Hello ${(world)}"; 

De volgende methodes blijven geldig

"Hello {$world}"; 
"Hello $world";

Breaking changes in PHP 8.2

Breaking betekent dat de update een conflict kan veroorzaken in de code van de vorige versie. Hierdoor kan de code compleet of deels niet meer functioneren.

Locale-insensitive strtolower() and strtoupper()

Zowel strtolower() als strtoupper() zijn niet meer locale-insensitive. Om locale-insensitive te blijven kan je dit vervangen met mb_strtolower().

Aanpassingen SPL methodes

Er zijn meerdere SPL methodes aangepast zodat ze het juiste type signature weergeven.

SplFileInfo::_bad_state_ex() 
SplFileObject::getCsvControl() 
SplFileObject::fflush() 
SplFileObject::ftell() 
SplFileObject::fgetc() 
SplFileObject::fpassthru() 
SplFileObject::hasChildren() 
SplFileObject::getChildren()

ODBC en PDO_ODBC extensie

De ODBC en PDO_ODBC extensies slaan nu de gebruikersnaam en wachtwoord over wanneer deze zich bevindt in een connection string en deze aangepast moet worden.

Wil jij ook op de nieuwste PHP versie gebruiken?

Laat software updates en server onderhoud aan ons over

avatar van Danny
Danny staat klaar om je te helpen
Naar contactpagina