Terug naar blog
phpphp85backend

PHP 8.5 features: wat is er nieuw voor enterprise applicaties

30 juli 202610 min leestijd

PHP 8.5 is uitgebracht in november 2025 en zet de lijn van de afgelopen releases door: minder boilerplate, meer expressiviteit en strakkere garanties van de engine. Waar PHP 8.4 met property hooks vooral het objectmodel moderniseerde, richt 8.5 zich op dataflows en immutability. In dit artikel behandelen we de features die er voor enterprise applicaties echt toe doen, met voorbeelden uit de praktijk.

De pipe operator: leesbare dataflows

De meest besproken toevoeging is de pipe operator |>. Die geeft het resultaat van een expressie door als argument aan de volgende callable, waardoor je dataflows van boven naar beneden leest in plaats van van binnen naar buiten:

$totaal = $orders
    |> (fn(array $items) => array_filter($items, fn(Order $o) => $o->isPaid()))
    |> (fn(array $items) => array_map(fn(Order $o) => $o->total(), $items))
    |> array_sum(...);

Zonder pipe operator schrijf je dit als geneste aanroepen of met tijdelijke variabelen die alleen bestaan om data door te geven. De pipe-variant leest als een recept: filter de betaalde orders, pak de totalen, tel ze op. Functies met één parameter kun je direct doorgeven met de first-class callable syntax, zoals array_sum(...) hierboven; voor functies met meerdere parameters gebruik je een arrow function tussen haakjes.

Clone with: immutable objects zonder boilerplaat

Readonly classes zijn sinds PHP 8.2 de standaard voor value objects, maar het aanpassen van één property betekende tot nu toe een handgeschreven wither-methode die alle constructorargumenten herhaalt. PHP 8.5 lost dat op met clone() met een property-array:

final readonly class Invoice
{
    public function __construct(
        public string $number,
        public InvoiceStatus $status,
        public ?DateTimeImmutable $paidAt = null,
    ) {}
 
    public function markPaid(): self
    {
        return clone($this, [
            'status' => InvoiceStatus::Paid,
            'paidAt' => new DateTimeImmutable(),
        ]);
    }
}

De clone respecteert de zichtbaarheid van properties: alleen code die een property mag schrijven, mag hem ook via clone aanpassen. Voor codebases met veel value objects en DTO's verdwijnt hiermee een complete categorie boilerplate.

array_first() en array_last()

Klein maar verrassend welkom: het eerste of laatste element van een array ophalen kan eindelijk zonder omwegen.

$eerste = array_first($orderRegels);
$laatste = array_last($orderRegels);

Tot nu toe gebruikte je hiervoor reset() en end(), die de interne array pointer verplaatsen, of de omslachtige combinatie $arr[array_key_first($arr)]. Beide nieuwe functies geven null terug bij een lege array, wat netjes samenwerkt met de null coalescing operator voor defaults.

Het #[\NoDiscard] attribuut

Functies waarvan de return-waarde genegeerd wordt, zijn een klassieke bron van bugs: denk aan validatieresultaten of nieuwe immutable objecten die ongebruikt verdwijnen. Met #[\NoDiscard] waarschuwt de engine daar voortaan voor:

#[\NoDiscard('controleer het validatieresultaat')]
function validateSku(string $sku): ValidationResult
{
    return ValidationResult::for($sku);
}
 
validateSku('AB-123456');

De aanroep op de laatste regel geeft een warning, omdat het resultaat nergens gebruikt wordt. Wil je een return-waarde bewust negeren, dan cast je naar (void). In combinatie met result-objects en immutable types maakt dit een hele klasse stille fouten zichtbaar.

Kleinere verbeteringen en deprecations

Naast de grote features bevat PHP 8.5 een reeks verbeteringen die in enterprise omgevingen direct waarde hebben:

  • Fatal errors met backtrace: fatals tonen voortaan een stacktrace, wat debuggen in productie aanzienlijk versnelt
  • Nieuwe URI extensie: ingebouwd parsen en normaliseren van URI's volgens RFC 3986 en de WHATWG URL standaard, zonder externe library
  • get_error_handler() en get_exception_handler(): eindelijk opvraagbaar welke handler actief is, handig voor frameworks en instrumentatie
  • Closures in constante expressies: static closures en first-class callables zijn nu toegestaan in attribuutparameters en default-waarden
  • #[\Override] op properties en #[\Deprecated] op traits en constanten: de attributen uit 8.3 en 8.4 worden breder inzetbaar

Aan de deprecation-kant verdwijnen onder meer de backtick operator als alias voor shell_exec(), de niet-canonieke casts zoals (boolean) en (integer), en null als array offset. Niets daarvan zou moderne codebases moeten raken, maar legacy code verdient een check.

Upgraden naar PHP 8.5

Een PHP-upgrade is in 2026 vooral een kwestie van methodisch werken:

  1. Controleer je dependencies met composer why-not php:8.5 en update packages die nog geen 8.5 ondersteunen
  2. Draai statische analyse met PHPStan en gebruik Rector om deprecated patronen automatisch om te zetten
  3. Zet een staging-omgeving op PHP 8.5 en monitor het deprecation log onder realistische load
  4. Pas daarna gaat productie om, bij voorkeur met een snelle rollback-optie achter de hand

PHP 8.5 is een actieve release met jaren support voor de boeg, terwijl oudere versies richting end-of-life schuiven. Wie nu nog op 8.2 of ouder draait, doet er verstandig aan de stap in één keer goed te plannen. De features hierboven zijn daarbij geen luxe maar directe winst in leesbaarheid, veiligheid en onderhoudbaarheid.

PHP 8.5 migratie nodig?

Wij helpen bij het upgraden van je applicatie naar PHP 8.5 en het implementeren van moderne PHP patterns.

Neem contact op