Aktuel situation: PHP2Shell. To kritiske PHP-sårbarheder (CVSS 9,2) tillader skadelig kode uden login. Rettelser siden 21.10.2026.Hvad der skal gøres nu →

PHP 8.0 til 8.5: de vigtigste nyheder

Fra match og JIT i PHP 8.0 til pipe-operator og URI-udvidelse i PHP 8.5: nyhederne i hver version, faldgruberne ved opgradering og hvad de giver for sikkerheden.

Status 5 min. læsetidPHP-viden

Kort sagt: PHP 8.0 (november 2020) bragte navngivne argumenter, attributter, union-typer, match, nullsafe-operatoren og en JIT-compiler. Derefter fulgte årligt: 8.1 med enums og fibers, 8.2 med readonly-klasser, 8.3 med typede klassekonstanter, 8.4 med property hooks og 8.5 med pipe-operator og URI-udvidelse. Hver version udfaser også gammelt. Ved opgradering tæller derfor tests, og for sikkerheden tæller først og fremmest at drive en understøttet gren med aktuel patch-status.

PHP 8-nyhederne i overblik

Tabellen sammenfatter hovedpunkterne fra udgivelsessiderne på php.net. Datoer for første udgivelse ifølge php.net.

Version Udkommet Vigtigste nyheder Udvalg af udfasninger og brud
8.0 26.11.2020 navngivne argumenter, attributter, constructor property promotion, union-typer, match, ?->, JIT 0 == 'foobar' er nu false, typefejl i stedet for advarsler
8.1 25.11.2021 enums, readonly-egenskaber, first-class callables strlen(...), new i initialisatorer, intersection-typer, never, fibers –
8.2 08.12.2022 readonly-klasser, DNF-typer, null/false/true som typer, Random-udvidelse, konstanter i traits, #[\SensitiveParameter] dynamiske egenskaber udfaset
8.3 23.11.2023 typede klassekonstanter, #[\Override], json_validate(), mb_str_pad(), php -l for flere filer –
8.4 21.11.2024 property hooks, asymmetrisk synlighed, #[\Deprecated], ny DOM-API med HTML5, BcMath\Number, array_find(), lazy objects implicit nullable parametre udfaset; IMAP, OCI8, PDO_OCI, pspell til PECL
8.5 20.11.2025 pipe-operator, URI-udvidelse, clone with, #[\NoDiscard], array_first()/array_last() backtick-operator udfaset, disable_classes fjernet

PHP 8.0 og 8.1: det store skridt

PHP 8.0 har gjort sproget mærkbart strengere og mere udtryksfuldt. Ifølge udgivelsessiden kaster interne funktioner nu konsekvent TypeError eller ValueError i stedet for blot at udgive advarsler. Sammenligninger mellem tal og tegnstrenge følger renere regler.

<?php
// PHP 8.0: match sammenligner strengt og behøver ikke break
$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 bragte enums, altså opregningstyper med faste værdier, og readonly-egenskaber, der kun kan sættes én gang:

<?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() kaster en fejl ved ukendte værdier. Det forhindrer, at vilkårlige tegnstrenge fra formularer slipper igennem som rolle. Den, der har brug for en tom værdi i stedet for en fejl, bruger Rolle::tryFrom(), som returnerer null ved ukendte værdier.

Ligeledes nyt i 8.1 er fibers, et grundlag for sideløbende forløb, som biblioteker til asynkron behandling bygger på. I almindelig website-drift mærker man lidt til det, i moderne frameworks og køer derimod en del.

PHP 8.2 og 8.3: oprydning og sikring

PHP 8.2 udfasede dynamiske egenskaber. Den, der tildeler et objekt en ikke-deklareret egenskab, får en notits; med #[\AllowDynamicProperties] kan det tillades for enkelte klasser. Ældre plugins producerer derfor ofte mange meddelelser i loggen.

Interessant for sikkerheden er den nye Random-udvidelse, hvis standard-randomizer ifølge udgivelsessiden bruger en kryptografisk sikker tilfældighedsgenerator, og attributten #[\SensitiveParameter], som skjuler værdier som adgangskoder i stacktraces. Mere om sikre tilfældige værdier under Sikre tilfældige tal og tokens i PHP.

PHP 8.3 supplerede med typede klassekonstanter, attributten #[\Override] mod tastefejl ved overskrivning af metoder og json_validate(), der kontrollerer JSON uden at dekode det fuldstændigt.

PHP 8.4 og 8.5: moderne sprogmidler

PHP 8.4 indførte property hooks, altså logik direkte på egenskaber, og asymmetrisk synlighed som public private(set). Hertil kom en ny DOM-API med HTML5-understøttelse og funktioner som array_find(), array_any() og array_all(). Ifølge udgivelsessiden blev udvidelserne IMAP, OCI8, PDO_OCI og pspell flyttet fra kernen til PECL. Applikationer, der f.eks. bruger IMAP, har så brug for en separat pakke.

PHP 8.5 bragte pipe-operatoren, som kæder kald fra venstre mod højre:

<?php
$slug = '  Neue Produkte 2026  '
    |> trim(...)
    |> strtolower(...)
    |> (fn(string $s): string => str_replace(' ', '-', $s));
// Resultat: "neue-produkte-2026"

Nyt er også en URI-udvidelse, der opdeler adresser efter RFC 3986 og WHATWG-URL-standarden. Det er sikkerhedsmæssigt relevant, fordi uensartet parsede URL'er er en kendt årsag til omgåede kontroller. Backtick-operatoren som kortform af shell_exec() er udfaset, indstillingen disable_classes blev fjernet. Den, der brugte den, bør tilpasse sin hærdning.

Nyheder, opgraderinger og PHP2Shell

Nye sprogfunktioner lukker ingen sårbarheder i fortolkeren. Mod PHP2Shell hjælper kun den aktuelle patch-status for den pågældende gren: 8.5.12, 8.4.27, 8.3.36 eller 8.2.35. Til PHP 8.1 og 8.0 findes der ikke længere officielle opdateringer. Den, der sidder fast dér, må opgradere, og herved hjælper nyhederne lidt, bruddene derimod meget.

En sikker opgraderingsvej i fem trin:

  1. Fastlæg målversionen, afstemt med producentens systemkrav og med udgivelsescyklussen.
  2. Bring afhængigheder via Composer og plugins op på kompatible versioner.
  3. Kontrollér koden med statisk analyse og tests mod målversionen.
  4. Prøv i et testmiljø med en kopi af produktionsdata, og analysér loggene for udfasninger.
  5. Omstil, genstart alle PHP-processer og dokumentér status.

Baggrund om typer giver PHP's typesystem.

Hvordan hjælper PHP SOS konkret?

  • Kontrollere kompatibilitet: Vi analyserer jeres kode og udvidelser for brud mod målversionen.
  • Gennemføre opgraderingen: Med migreringen til en understøttet PHP-version løfter vi applikationer testet op.
  • Tilpasse hærdningen: Vi erstatter fjernede indstillinger som disable_classes med virksomme alternativer.
  • Holde patch-status: Efter opgraderingen holder vi grenen aktuel og dokumenterer hver genstart.

Ofte stillede spørgsmål

Hvilken PHP 8-version bør jeg bruge i dag?

Til nye projekter PHP 8.4 eller 8.5, fordi de understøttes længst: 8.4 til udgangen af 2028, 8.5 til udgangen af 2029. Afgørende er, hvad jeres applikation ifølge producentens systemkrav understøtter. PHP 8.2 slutter den 31. december 2026.

Hvad går oftest i stykker ved skiftet fra PHP 7.4 til PHP 8?

Ofte er det strengere typekontroller: Interne funktioner kaster i PHP 8 TypeError eller ValueError i stedet for blot at udgive advarsler. Også ændrede sammenligninger mellem tal og tegnstrenge er påfaldende. Statisk analyse og tests afdækker det meste på forhånd.

Gør JIT mit website hurtigere?

Som regel næppe. Ifølge udgivelsessiden til PHP 8.0 ligger ydelsen for typiske webapplikationer omtrent på niveau med PHP 7.4, mens regnetunge opgaver kan have klar fordel. Siden PHP 8.4 er JIT slået fra som standard.

Hvilke nyheder hjælper sikkerheden?

Blandt andet den nye Random-udvidelse i PHP 8.2 med kryptografisk sikker standard, attributten SensitiveParameter mod adgangskoder i stacktraces, enums og readonly-egenskaber til mere entydige data samt de mere konsekvente typefejl siden PHP 8.0.

Kilder

Akut kontakt

Hver time tæller. Skriv til os nu.

Beskriv kort system, PHP-version og observation. Vi vender tilbage, afklarer situationen og arbejder på afstand, indtil hændelsen er afsluttet og dokumenteret.

Akut hjælp