100 % lokal — Ihre Daten verlassen nie Ihren Browser

JSON in PHP — Klassen mit promoted Properties

Ein JSON-Beispiel in PHP-8-Klassen mit promoted Constructor Properties verwandeln. Eine umbenannte Property behält den Originalschlüssel im Kommentar.

Sofort Privat Null Cookies

JSON-Eingabe

PHP-Ausgabe

Was dieses Werkzeug tut

Aus einer JSON-Probe werden PHP-Klassen mit im Konstruktor beförderten Eigenschaften.

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
<?php

declare(strict_types=1);

class Root
{
    public function __construct(
        public int $id,
        public string $firstName,
        public Address $address,
    ) {
    }
}

Die Beförderung von Eigenschaften braucht PHP 8.0, der readonly-Schalter 8.1. Das declare(strict_types=1) steht mit Absicht da: ohne es würde PHP eine Zeichenkette klaglos in einen int-Parameter wandeln, und Sie verlören genau die Prüfung, für die die Typen da sind.

Eine umbenannte Eigenschaft behält ihren Schlüssel

Eigenschaftsnamen stehen hier in camelCase: ein Schlüssel mit Bindestrich oder führender Ziffer übersteht das nicht als Name. Passiert das, steht der Schlüssel daneben:

        /** JSON key: "content-type" */
        public string $contentType,
        public int $fooBar,
        /** JSON key: "foo-bar" */
        public int $fooBar2,

Dieses letzte Paar ist der Grund: fooBar und foo-bar wollen beide $fooBar, das zweite wird also $fooBar2 — und ohne den Kommentar sagte nichts in der Datei, welches von welchem kam. PHP hat kein standardisiertes Attribut, das das trüge, also trägt es ein Kommentar, und nur dort, wo der Name den Schlüssel nicht mehr trägt.

Das war eine echte Lücke, beim Schreiben dieser Seite gefunden: PHP war der einzige dieser Generatoren, der den Schlüssel vollständig verlor. Go hat seinen Tag, Java und C# ihre Annotation, Swift seine CodingKeys, Dart sein fromJson.

Was PHP nicht einengen kann

  • array für jede Liste. Die Sprache hat keine Generics; list<string> lebt in einem PHPStan- oder Psalm-Docblock, und welchen Sie nutzen, kann eine Probe nicht wissen.
  • mixed für null und unbekannte Werte. Der ehrliche Typ: er nimmt alles, und declare(strict_types=1) rettet Sie dort nicht. Engen Sie ihn ein, sobald das Feld einen echten Typ hat.
  • Ein Skalar an der Wurzel wird abgelehnt. PHP hat keinen Typalias, 42 oder "Text" hat also nichts, was es werden könnte.

Was eine Probe nicht sagen kann

Keine Eigenschaft ist nullbar und keine hat einen Vorgabewert: das Dokument hatte für jede einen Wert. ?string und = null sind die Änderungen, sobald eine zweite Nutzlast zeigt, dass der Schlüssel fehlen darf — und readonly lohnt sich, wenn diese Objekte gelesen und nicht befüllt werden sollen.

Datenschutz ab Werk

Alles läuft lokal in deinem Browser mit JavaScript. Deine Daten werden nie hochgeladen, wodurch das Tool auch für sensible Inhalte sicher ist und offline funktioniert.

Häufige Fragen

Warum steht der JSON-Schlüssel in einem Kommentar statt in einem Attribut?
Weil PHP kein standardisiertes Zuordnungsattribut hat. Symfony will `#[SerializedName]`, JMS sein eigenes, und schlichtes `json_decode` will gar keines — eines auszugeben hieße, ein Framework für Sie zu wählen. Der Kommentar kostet nichts, übersteht das Kopieren und sagt Ihnen, woher `$contentType` kommt. Setzen Sie das Attribut Ihres Frameworks darüber, wenn Sie eines nutzen.
Wie baue ich so ein Objekt aus JSON?
Mit benannten Argumenten, solange die Schlüssel gültige Namen sind: `new Root(...json_decode($body, true))`. Ist ein Schlüssel es nicht — `content-type`, `2fa` —, kann das Entpacken ihn nicht benennen: weisen Sie ausdrücklich zu, `new Root(contentType: $data['content-type'], …)`. Der Kommentar neben jeder Eigenschaft sagt, welchen Schlüssel Sie lesen.
Was bedeutet `array` hier?
Ein PHP-Array, und nichts Genaueres: die Sprache hat keine generischen Typen. `list<string>` gibt es nur für statische Prüfer wie PHPStan und Psalm, in einem Docblock. Läuft einer bei Ihnen, ist `/** @var list<string> $tags */` die Zeile — diese Ausgabe rät nicht, welchen Sie einsetzen.

Ähnliche Konverter