---
title: 'PHP 8.3: Typed Constants, #[Override], json_validate & Upgrade Notes | DevSense'
description: 'Leitfaden für PHP 8.3: #[Override], typisierte Klassenkonstanten, Anpassungen beim Klonen von Readonly-Eigenschaften, json_validate, str_increment/str_decrement, sicherere range() und proc_get_status(), Assert-INI-Deprecations und Migrationsklippen.'
faq:
    - { question: 'Was bewirkt das Attribut #[Override] in PHP 8.3?', answer: 'Das Attribut #[Override] kennzeichnet eine Methode, die eine Methode der Elternklasse oder eine Interface-Deklaration überschreiben muss. Wird die Methode der Elternklasse umbenannt oder gelöscht, löst PHP einen Fatal Error zur Kompilierzeit aus.' }
    - { question: 'Wie funktionieren typisierte Klassenkonstanten in PHP 8.3?', answer: 'Konstanten in Klassen, Interfaces, Traits und Enums können jetzt spezifische Typen deklarieren (wie string, int, bool, float oder array). Die zugewiesenen Werte müssen diesem Typ zur Kompilierzeit strikt entsprechen.' }
    - { question: 'Welchen Vorteil bietet json_validate() in PHP 8.3?', answer: 'json_validate() prüft, ob ein String gültiges JSON enthält, ohne ihn zu dekodieren. Dies spart im Vergleich zu json_decode() erheblichen CPU- und Speicher-Overhead bei Validierungsprüfungen.' }
    - { question: 'Wie ändert sich das Klonen von schreibgeschützten Eigenschaften in PHP 8.3?', answer: 'Readonly-Eigenschaften können jetzt innerhalb der Methode `__clone()` neu initialisiert werden, was das tiefe Klonen (deep cloning) und das Ändern von unveränderlichen Strukturen erleichtert.' }
published: '2026-05-31'
---
# PHP 8.3: Hauptmerkmale

Ein Verfeinerungs-Release für Teams auf PHP 8.2.x: stärkere Invarianten (`#[Override]`, typisierte Konstanten), bessere Ergonomie bei JSON und Strings (`json_validate`, `str_increment`/`str_decrement`) und eine Reihe kleinerer Laufzeitänderungen, die sich unter Last oder in Randfällen bemerkbar machen.

## Inhalt
* [`#[\Override]` — Fehlende Überschreibungen zur Kompilierzeit erkennen](#override-attribute)
* [Typisierte Klassenkonstanten](#typed-constants)
* [Readonly: Anonyme Klassen & Klonen](#readonly-tweaks)
* [Komfortverbesserungen (QoL) der Sprache](#language-qol)
* [Neue Funktionen, die man nutzen sollte (`json_validate`, `str_*`, DOM, Random)](#new-functions)
* [Rückwärtskompatibilität und BC-Breaks (Migrationshinweise)](#backward-incompatible)
* [Veraltete Features (String-Inkrement, `get_class()`, Assert-INI)](#deprecations)
* [Andere Änderungen & Betrieb (gc_status, Streams, Highlights)](#other-changes)
* [Häufige Fehler](#common-mistakes)
* [Selbsttest-Quiz](#self-test-quiz)

---

Bei PHP 8.3 geht es vor allem darum, die Vertragssicherheit (Contracts) zu stärken und den Ressourcenverbrauch zu optimieren. Durch die Einführung typisierter Klassenkonstanten und des Attributs `#[\Override]` macht PHP das Refactoring sicherer und verhindert unbemerktes Auseinanderdriften von APIs. Für Entwickler, die hochfrequentierte APIs betreuen, bietet die neue Funktion `json_validate()` eine ressourcenschonende Möglichkeit, Payloads zu validieren, ohne unnötigen Speicher für das vollständige Parsen zu verschwenden. Flankiert werden diese Verbesserungen jedoch von strengeren Validierungsregeln in der Standardbibliothek (insbesondere bei `range()` und Socket-Funktionen) sowie der Abschaffung des veralteten Verhaltens beim Inkrementieren von Strings. Hier erfahren Sie, wie Sie Ihre Anwendungen nahtlos aktualisieren.

<a id="override-attribute"></a>
## `#[\Override]` — Fehlende Überschreibungen zur Kompilierzeit erkennen

Markieren Sie Methoden, die eine Methode einer Elternklasse oder eines Interfaces überschreiben sollen. Wenn der Name falsch geschrieben ist oder die Elternklasse die Methode entfernt, **schlägt PHP frühzeitig fehl**, anstatt stillschweigend eine neue Methode einzuführen.

> [!NOTE]
> **Wussten Sie schon?**
> Das Attribut `#[Override]` wird von der Engine zur Ausführungszeit komplett ignoriert! Es handelt sich um eine reine Prüfung zur Kompilierzeit, die Refactoring-Fehler und Abweichungen von Interfaces aufdecken soll, noch bevor der Code ausgeführt wird.

```php
// app/Services/Loggers/FileLogger.php
interface Logger
{
    public function log(string $message): void;
}

final class FileLogger implements Logger
{
    #[\Override]
    public function log(string $message): void
    {
        // ...
    }
}
```

Nutzen Sie dieses Attribut vor allem in großen Codebases, um bei Refactorings (z. B. dem Umbenennen von Interface-Methoden) sofort Fehler aufgezeigt zu bekommen.

---

<a id="typed-constants"></a>
## Typisierte Klassenkonstanten

Konstanten in **Klassen, Interfaces, Traits und Enums** können nun Typen deklarieren. Damit werden Konstanten in das übrige Typsystem integriert.

```php
// app/Config/AppConfig.php
interface Config
{
    public const string APP_NAME = 'MyApp';
}
```

Dies reduziert Fehler durch „falsche Konstantentypen“, die sich früher erst zur Laufzeit an der Verwendungsstelle bemerkbar machten.

---

<a id="readonly-tweaks"></a>
## Readonly: Anonyme Klassen & Klonen

* **Anonyme Klassen** können nun als `readonly` deklariert werden.
* **Readonly-Eigenschaften** können **während des Klonens** (innerhalb der magischen Methode `__clone()`) **neu initialisiert** werden. Dies macht das Klonen unveränderlicher Strukturen deutlich flexibler als in PHP 8.2.

---

<a id="language-qol"></a>
## Komfortverbesserungen (QoL) der Sprache

* **Dynamischer Zugriff auf Klassenkonstanten**: Syntax wie `SomeClass::{$name}` zur Laufzeit.
* **Initialisierer für statische Variablen** dürfen beliebige Ausdrücke enthalten (nicht mehr nur konstante Werte).
* **`final` bei Trait-Methoden** ist nun beim Importieren erlaubt.
* **Closures aus magischen Methoden** können beim Aufruf **benannte Argumente** empfangen.
* **`php.ini`**: Unterstützung für Standardwert-Fallbacks für sauberere Systemkonfigurationen.

---

<a id="new-functions"></a>
## Neue Funktionen, die man nutzen sollte

### `json_validate()`

Validiert JSON-Strings, **ohne sie zu dekodieren** und PHP-Werte im Speicher zu erzeugen. Ideal für APIs, Queues und schnelle Validierungen vor dem teureren Aufruf von `json_decode()`.

> [!NOTE]
> **Wussten Sie schon?**
> Die Verwendung von `json_validate()` verbraucht erheblich weniger Arbeitsspeicher als `json_decode()`, da keine PHP-Arrays oder -Objekte erzeugt werden! Die Funktion scannt lediglich die Syntax des Strings, was sie perfekt für die Validierung großer Datenmengen macht.

```php
// app/Http/Middleware/JsonValidateMiddleware.php
if (!json_validate($payload)) {
    throw new InvalidArgumentException('Ungültiges JSON');
}
$data = json_decode($payload, true, flags: JSON_THROW_ON_ERROR);
```

### `str_increment()` / `str_decrement()`

Empfohlene Nachfolger für das veraltete Inkrementieren/Dekrementieren mittels `++`/`--` auf Strings (siehe Deprecations). Nutzen Sie diese für alphanumerische Zähler.

```php
// app/Services/CounterService.php
$next = str_increment('a9'); // Vorhersagbares Verhalten statt String-Inkrement mit ++
$prev = str_decrement($next);
```

### DOM, Intl, Random, POSIX etc.

PHP 8.3 fügt viele neue **DOM**-Methoden hinzu (z. B. `insertAdjacentElement`, `getRootNode`, `replaceChildren`), neue **Intl**-Kalender-Helper, **Randomizer**-Erweiterungen (`getFloat`, `nextFloat` etc.) sowie die **POSIX**-Funktionen `sysconf`/`pathconf`/`eaccess` – nützlich für systemnahe Skripte und CLI-Tools.

---

<a id="backward-incompatible"></a>
## Rückwärtskompatibilität und BC-Breaks (Migrationshinweise)

### Stack / Timer / Fibers

* **Tiefe Rekursion**: Aufrufe nahe dem Stack-Limit können nun einen `Error` auslösen, wenn `zend.max_allowed_stack_size` überschritten wird. Fibers nutzen `fiber.stack_size` auf ähnliche Weise.
* **Zend Max Execution Timers** sind bei ZTS-Builds unter Linux nun standardmäßig **aktiviert** – Vorsicht bei lang laufenden CLI-Workern.

### Prozesse

* **`proc_get_status()`** unter POSIX liefert bei **wiederholten** Aufrufen korrekte Werte; die Ergebnisse können **gecached** werden (prüfen Sie den Schlüssel `"cached"`). Ein Aufruf von **`proc_close()`** nach `proc_get_status()` liefert nun den echten Exit-Code statt `-1`.

### Arrays & Traits

* **Sichtbarkeit von Klassenkonstanten**: Die Varianzprüfung wird nun erzwungen, wenn Konstanten von **Interfaces** geerbt werden.
* **Leeres Array + negativer erster Index**: Der nächste implizit erzeugte Schlüssel folgt nun der Regel `n+1` (und fängt nicht mehr bei `0` an).
* **Traits mit statischen Eigenschaften**: Geerbte statische Eigenschaften der Elternklasse werden nun für jede Klasse, die den Trait nutzt, **neu deklariert** (getrennter Speicherbereich).

### Standard-Bibliothek (Hohe Auswirkung)

* **`range()`**: Strengere Validierung (`TypeError`/`ValueError` bei ungültigen Eingaben), mehr Warnungen bei unplausiblen Grenzen und verändertes Verhalten bei Zeichenbereichen, wenn die Grenzen wie Zahlen aussehen. **Testen Sie Code**, der Ranges aus Benutzereingaben generiert.
* **`number_format()`**: Negative Werte bei `$decimals` runden nun **vor** dem Dezimalpunkt (wurde früher ignoriert).
* **`file()`**: Ungültige Flag-Kombinationen werden nun abgelehnt (z. B. wurde `FILE_APPEND` früher stillschweigend ignoriert).

### Date / DOM / FFI / Opcache

* **Date**: Detailliertere Klassenhierarchien für **`DateError` und `DateException`** statt generischer Fehlermeldungen – passen Sie Ihre `catch`-Blöcke an.
* **DOM**: Spezifikationskonformes Verhalten für Knoten ohne Elternknoten; Korrekturen bei `createAttributeNS()`. Neue Klassenmitglieder können **Konflikte** mit eigenen Kindklassen verursachen.
* **FFI**: C-Funktionen vom Typ `void` geben nun **`null`** zurück anstelle eines Dummy-Objekts des Typs `FFI\CData:void`.
* **Opcache**: `opcache.consistency_checks` wurde **entfernt** (war in Kombination mit Tracing JIT und dem Vererbungscache fehlerhaft).

### WeakMap

* **Selbstreferenzierende Schlüssel** in einer `WeakMap` können nun im Garbage-Collector-Zyklus bereinigt werden, wenn sie nur noch über die Iteration der Map erreichbar sind.

---

<a id="deprecations"></a>
## Veraltete Features (Deprecations)

### String-Inkrement/-Dekrement über `++` / `--`

Das Inkrementieren/Dekrementieren von **leeren oder nicht-numerischen** Strings ist veraltet. Verwenden Sie für neuen Code stattdessen **`str_increment()`** und **`str_decrement()`**.

### `get_class()` / `get_parent_class()` ohne Argumente

Der Aufruf dieser Funktionen **ohne Argumente** ist veraltet. Übergeben Sie das Objekt oder den Klassennamen explizit.

### Assert

* **`assert_options()`** und die dazugehörigen **Konstanten** sind veraltet.
* Die **INI-Einstellungen `assert.*`** sind veraltet.

---

<a id="other-changes"></a>
## Andere Änderungen & Betrieb

* **`gc_status()`** liefert detailliertere Zeitmessungen (Sammlungs-/Destruktor-/Freigabezeiten) – nützlich beim Tuning speicherintensiver Prozesse.
* **Streams**: `fread()` auf Sockets kann früher zurückkehren, wenn gepufferte Daten vorhanden sind.
* **`open_basedir`**: Aufrufe von `ini_set` zur Laufzeit lehnen Pfade ab, die `..` enthalten, selbst wenn `./` vorangestellt ist.

---

<a id="common-mistakes"></a>
## ⚠️ Häufige Fehler

Hier sind typische Stolpersteine unter PHP 8.3:

### 1. Verwendung des Inkrementoperators (++) auf Strings
In PHP 8.3 führt die Verwendung von `++` oder `--` auf nicht-numerischen Strings zu einer Deprecation-Warnung.

```php
// app/Services/Counter.php
// SCHLECHT: Löst eine Deprecation-Warnung aus
$code = 'a9';
$code++; 

// GUT: Verwenden Sie die neue Hilfsfunktion str_increment
$code = str_increment('a9'); // 'b0'
```

### 2. Fehlende Kompatibilität bei typisierten Konstanten in Kindklassen
Definiert eine Elternklasse eine typisierte Konstante, müssen Kindklassen, die diese Konstante überschreiben, den Typ exakt matchen.

```php
// app/Config/DatabaseConfig.php
class ParentConfig {
    public const string DRIVER = 'mysql';
}

// SCHLECHT: Fatal Error: ChildConfig::DRIVER type (int) is not compatible with ParentConfig::DRIVER type (string)
class ChildConfig extends ParentConfig {
    public const int DRIVER = 123; 
}
```

### 3. Aufruf von `get_class()` ohne Argumente
Der Aufruf von `get_class()` ohne Argumente, um den Namen der aktuellen Klasse zu ermitteln, ist in PHP 8.3 veraltet.

```php
// app/Services/LogService.php
// SCHLECHT: Löst eine Deprecation-Warnung aus
class LogService {
    public function log(): void {
        echo "Log aus " . get_class(); 
    }
}

// GUT: Verwenden Sie self::class oder übergeben Sie $this explizit
class LogService {
    public function log(): void {
        echo "Log aus " . self::class; 
        // ODER: echo "Log aus " . get_class($this);
    }
}
```

---

<a id="self-test-quiz"></a>
## Selbsttest-Quiz

Testen Sie Ihr Wissen über PHP 8.3.

### Frage 1: Was passiert, wenn Sie in PHP 8.3 einer typisierten Klassenkonstante einen Wert eines anderen Typs zuweisen (z. B. `public const int NAME = 'MyApp';`)?
* A) Es wird eine Deprecation-Warnung ausgelöst, aber der Code läuft weiter.
* B) PHP konvertiert den String automatisch in den Integer-Wert `0`.
* C) Es wird ein `Fatal Error` zur Kompilierzeit ausgelöst.

<details>
<summary>Antworten anzeigen</summary>

**Richtige Antwort: C**  
In PHP 8.3 werden typisierte Klassenkonstanten zur Kompilierzeit streng geprüft. Die Zuweisung eines inkompatiblen Werts führt zu einem Fatal Error.
</details>

### Frage 2: Warum sollten Sie `json_validate()` statt `json_decode()` verwenden, wenn Sie nur prüfen wollen, ob ein String gültiges JSON enthält?
* A) `json_validate()` ist schneller und verbraucht deutlich weniger Speicher, da keine PHP-Array- oder Objektstrukturen aufgebaut werden.
* B) `json_validate()` unterstützt JSON-Formate, die `json_decode()` nicht verarbeiten kann.
* C) `json_decode()` wird in zukünftigen PHP-Versionen als veraltet markiert.

<details>
<summary>Antworten anzeigen</summary>

**Richtige Antwort: A**  
`json_validate()` prüft nur die Syntax des JSON-Strings, ohne Speicher für die dekodierten Strukturen zu reservieren. Das macht die Funktion für reine Validierungsschritte hochperformant.
</details>

---

## Zusammenfassung

PHP 8.3 stärkt die Typsicherheit und optimiert die Ressourcennutzung. Durch die Einführung typisierter Klassenkonstanten und des Attributs `#[Override]` werden API-Drifts verhindert und Refactorings sicherer.