Kort gezegd: PHP 8.0 (november 2020) bracht benoemde argumenten, attributen, uniontypen, match, de nullsafe-operator en een JIT-compiler. Daarna volgden jaarlijks: 8.1 met enums en fibers, 8.2 met readonly-klassen, 8.3 met getypeerde klasseconstanten, 8.4 met property hooks en 8.5 met pipe-operator en URI-extensie. Elke versie keurt ook oude zaken af. Bij het upgraden tellen daarom tests, en voor de beveiliging telt vooral het draaien van een ondersteunde tak met actuele patchstand.
De nieuwigheden van PHP 8 in overzicht
De tabel vat de kernpunten van de releasepagina's van php.net samen. Data van de eerste publicatie volgens php.net.
| Versie | Verschenen | Belangrijkste nieuwigheden | Selectie afgekeurd en incompatibel |
|---|---|---|---|
| 8.0 | 26-11-2020 | benoemde argumenten, attributen, constructor property promotion, uniontypen, match, ?->, JIT |
0 == 'foobar' is nu false, typefouten in plaats van waarschuwingen |
| 8.1 | 25-11-2021 | enums, readonly-eigenschappen, first-class callables strlen(...), new in initialisaties, intersectietypen, never, fibers |
– |
| 8.2 | 08-12-2022 | readonly-klassen, DNF-typen, null/false/true als typen, Random-extensie, constanten in traits, #[\SensitiveParameter] |
dynamische eigenschappen afgekeurd |
| 8.3 | 23-11-2023 | getypeerde klasseconstanten, #[\Override], json_validate(), mb_str_pad(), php -l voor meerdere bestanden |
– |
| 8.4 | 21-11-2024 | property hooks, asymmetrische zichtbaarheid, #[\Deprecated], nieuwe DOM-API met HTML5, BcMath\Number, array_find(), lazy objects |
impliciet nullable parameters afgekeurd; IMAP, OCI8, PDO_OCI, pspell naar PECL |
| 8.5 | 20-11-2025 | pipe-operator, URI-extensie, clone with, #[\NoDiscard], array_first()/array_last() |
backtick-operator afgekeurd, disable_classes verwijderd |
PHP 8.0 en 8.1: de grote stap
PHP 8.0 heeft de taal merkbaar strenger en expressiever gemaakt. Volgens de releasepagina gooien interne functies nu consequent TypeError of ValueError in plaats van alleen waarschuwingen te geven. Vergelijkingen tussen getallen en tekenreeksen volgen zuiverder regels.
<?php
// PHP 8.0: match vergelijkt strikt en heeft geen break nodig
$status = 404;
echo match (true) {
$status >= 500 => 'Serverfehler',
$status >= 400 => 'Anfragefehler',
default => 'in Ordnung',
};
// PHP 8.0: nullsafe-operator
$land = $bestellung?->kunde?->adresse?->land;
PHP 8.1 bracht enums, dus opsommingstypen met vaste waarden, en readonly-eigenschappen die maar één keer kunnen worden ingesteld:
<?php
enum Rolle: string {
case Leser = 'leser';
case Redakteur = 'redakteur';
case Admin = 'admin';
}
final class Benutzer {
public function __construct(
public readonly string $name,
public readonly Rolle $rolle,
) {}
}
$b = new Benutzer('Erika', Rolle::from('redakteur'));
Rolle::from() gooit een fout bij onbekende waarden. Dat voorkomt dat willekeurige tekenreeksen uit formulieren als rol doorglippen. Wie in plaats van een fout een lege waarde nodig heeft, gebruikt Rolle::tryFrom(), dat bij onbekende waarden null teruggeeft.
Eveneens nieuw in 8.1 zijn fibers, een basis voor gelijktijdige verwerking waarop bibliotheken voor asynchrone verwerking voortbouwen. In de normale websitepraktijk merkt men daar weinig van, in moderne frameworks en wachtrijen daarentegen wel.
PHP 8.2 en 8.3: opruimen en beveiligen
PHP 8.2 keurde dynamische eigenschappen af. Wie een object een niet-gedeclareerde eigenschap toewijst, krijgt een melding; met #[\AllowDynamicProperties] kan dat voor afzonderlijke klassen worden toegestaan. Oudere plug-ins zorgen daarom vaak voor veel meldingen in het log.
Voor de beveiliging interessant zijn de nieuwe Random-extensie, waarvan de standaardrandomizer volgens de releasepagina een cryptografisch veilige toevalsgenerator gebruikt, en het attribuut #[\SensitiveParameter], dat waarden als wachtwoorden in stacktraces verbergt. Meer over veilige toevalswaarden onder Veilige willekeurige getallen en tokens in PHP.
PHP 8.3 voegde getypeerde klasseconstanten toe, het attribuut #[\Override] tegen typefouten bij het overschrijven van methoden en json_validate(), dat JSON controleert zonder het volledig te decoderen.
PHP 8.4 en 8.5: moderne taalmiddelen
PHP 8.4 voerde property hooks in, dus logica direct aan eigenschappen, en asymmetrische zichtbaarheid zoals public private(set). Daarbij kwamen een nieuwe DOM-API met HTML5-ondersteuning en functies als array_find(), array_any() en array_all(). Volgens de releasepagina zijn de extensies IMAP, OCI8, PDO_OCI en pspell uit de kern naar PECL verplaatst. Toepassingen die bijvoorbeeld IMAP gebruiken, hebben dan een apart pakket nodig.
PHP 8.5 bracht de pipe-operator, die aanroepen van links naar rechts aaneenschakelt:
<?php
$slug = ' Neue Produkte 2026 '
|> trim(...)
|> strtolower(...)
|> (fn(string $s): string => str_replace(' ', '-', $s));
// Resultaat: "neue-produkte-2026"
Nieuw is ook een URI-extensie die adressen volgens RFC 3986 en de WHATWG-URL-standaard ontleedt. Dat is voor de beveiliging relevant, omdat onderling verschillend ontlede URL's een bekende oorzaak van omzeilde controles zijn. De backtick-operator als verkorte vorm van shell_exec() is afgekeurd, de instelling disable_classes is verwijderd. Wie die gebruikte, moet zijn hardening aanpassen.
Nieuwigheden, upgrades en PHP2Shell
Nieuwe taalfuncties dichten geen lekken in de interpreter. Tegen PHP2Shell helpt alleen de actuele patchstand van de betreffende tak: 8.5.12, 8.4.27, 8.3.36 of 8.2.35. Voor PHP 8.1 en 8.0 zijn er geen officiële updates meer. Wie daar vastzit, moet upgraden, en daarbij helpen de nieuwigheden weinig, de incompatibiliteiten daarentegen veel.
Een veilige upgrade-aanpak in vijf stappen:
- Doelversie vastleggen, passend bij de systeemvereisten van de fabrikant en de releasecyclus.
- Afhankelijkheden via Composer en plug-ins naar compatibele standen brengen.
- Code met statische analyse en tests tegen de doelversie controleren.
- In een testomgeving met een kopie van de productiegegevens uitproberen en de logs op afkeuringen analyseren.
- Omschakelen, alle PHP-processen opnieuw starten en de stand documenteren.
Achtergronden over typen biedt Het typesysteem van PHP.
Hoe helpt PHP SOS concreet?
- Compatibiliteit controleren: Wij analyseren uw code en uw extensies op incompatibiliteiten met de doelversie.
- Upgrade uitvoeren: Met de migratie naar een ondersteunde PHP-versie tillen wij toepassingen getest omhoog.
- Hardening aanpassen: Wij vervangen verwijderde instellingen als
disable_classesdoor werkzame alternatieven. - Patchstand bijhouden: Na de upgrade houden wij de tak actueel en leggen elke herstart vast.
Veelgestelde vragen
Welke PHP 8-versie moet ik vandaag gebruiken?
Voor nieuwe projecten PHP 8.4 of 8.5, omdat ze het langst worden ondersteund: 8.4 tot eind 2028, 8.5 tot eind 2029. Beslissend is wat uw toepassing volgens de systeemvereisten van de fabrikant ondersteunt. PHP 8.2 eindigt op 31 december 2026.
Wat breekt het vaakst bij de overstap van PHP 7.4 naar PHP 8?
Vaak zijn het strengere typecontroles: interne functies gooien in PHP 8 TypeError of ValueError in plaats van alleen waarschuwingen te geven. Ook gewijzigde vergelijkingen tussen getallen en tekenreeksen vallen op. Statische analyse en tests brengen het meeste vooraf aan het licht.
Maakt de JIT mijn website sneller?
Meestal nauwelijks. Volgens de releasepagina van PHP 8.0 ligt de prestatie van typische webtoepassingen ongeveer op het niveau van PHP 7.4, terwijl rekenintensieve taken duidelijk kunnen profiteren. Sinds PHP 8.4 staat de JIT standaard uitgeschakeld.
Welke nieuwigheden helpen de beveiliging?
Onder meer de nieuwe Random-extensie in PHP 8.2 met cryptografisch veilige standaard, het attribuut SensitiveParameter tegen wachtwoorden in stacktraces, enums en readonly-eigenschappen voor eenduidiger gegevens en de consequentere typefouten sinds PHP 8.0.