Zurück zur Startseite

Typsichere PHP-Arrays: +4x Geschwindigkeit

Der Artikel analysiert Optimierungen der sbwerewolf/language-specific Bibliothek: 4x Beschleunigung, Vergleich mit wplake/typed. Benchmarks, Code-Beispiele der chainable API und neue Features wie Unveränderlichkeit werden bereitgestellt.

PHP: typsichere Arrays 4-mal schneller
Advertisement 728x90

Typsichere PHP-Arrays: 4-mal schneller – ohne Einbußen bei der Lesbarkeit

Die Bibliothek sbwerewolf/language-specific in Version 10.4.5 erzielt eine 4-mal höhere Performance gegenüber Version 8.4.1. Der Leistungsabstand zu wplake/typed (1.2.2) hat sich auf lediglich das Zweifache verringert. Erstere nutzt Pfadangaben als Zeichenketten; letztere setzt auf Methoden-Chaining, um verschachtelte Datenstrukturen zu navigieren.

Beispiel mit wplake/typed:

use WPLake\Typed\Typed;

$response = file_get_contents(
    'https://geocode-maps.yandex.ru/1.x/?apikey=d3893dc1-c136-4084-b9c-4db26b00463e&geocode=Mohammed+Bin+Rashid+Boulevard+1&lang=en_US&format=json'
);

$object = json_decode(json: $response, associative: true, flags: JSON_THROW_ON_ERROR);

$path = 'response.GeoObjectCollection.featureMember.0.GeoObject.metaDataProperty.GeocoderMetaData.Address.formatted';

// Wert mit Fallback
$val = Typed::string($object, $path, 'Adresse nicht gefunden');
var_dump($val);
/*
string(77)
"1, Mohammed Bin Rashid Boulevard, Downtown Dubai, Dubai, Vereinigte Arabische Emirate"
*/

$isReal = Typed::stringOrNull($object, $path) !== null;
var_dump($isReal);
/* bool(true) */

Äquivalente Funktionalität in sbwerewolf/language-specific:

Google AdInline article slot
use SbWereWolf\LanguageSpecific\AdvancedArrayFactory;

$response = file_get_contents('https://geocode-maps.yandex.ru/1.x/?apikey=d3893dc1-c136-4084-b9c-4db26b00463e&geocode=Mohammed+Bin+Rashid+Boulevard+1&lang=en_US&format=json');

$object = json_decode(json: $response, associative: true, flags: JSON_THROW_ON_ERROR);
$data = new AdvancedArrayFactory()->makeAdvancedArray($object);
$formatted = $data
    ->pull("response")
    ->pull("GeoObjectCollection")
    ->pull("featureMember")
    ->pull()
    ->pull("GeoObject")
    ->pull("metaDataProperty")
    ->pull("GeocoderMetaData")
    ->pull("Address")
    ->get("formatted")
    ->default("Adresse nicht gefunden");
$val = $formatted->str();
var_dump($val);
/* 
string(77)
"1, Mohammed Bin Rashid Boulevard, Downtown Dubai, Dubai, Vereinigte Arabische Emirate"
*/
$isReal = $formatted->isReal();
var_dump($isReal);
/* bool(true) */

Performance-Vergleich

Die Benchmarks spiegeln reale Anwendungsfälle wider: JSON-Parsing im Erfolgsfall, Behandlung fehlender Pfade, Prüfung auf Elementvorhandensein, Typkonvertierung und direkter Zugriff auf Rohwerte.

| Anwendungsfall | 8.4.1 (vorher) | 10.4.5 (nachher) | 1.2.2 (wplake/typed) |

|----------------|----------------|----------------|------------------------|

Google AdInline article slot

| JSON-Erfolgsfall-Parsing | 29,210 µs/op | 6,467 µs/op | 3,013 µs/op |

| JSON-Parsing bei fehlendem Pfad | 18,716 µs/op | 5,987 µs/op | 1,766 µs/op |

| Prüfung auf Elementvorhandensein | 27,237 µs/op | 6,277 µs/op | 2,863 µs/op |

Google AdInline article slot

| Typkonvertierung | 28,581 µs/op | 6,740 µs/op | 2,966 µs/op |

| Direkter Zugriff auf Rohwert | 30,395 µs/op | 6,558 µs/op | 3,015 µs/op |

| Extraktion aller Skalarwerte | 5,897 µs/op | 1,878 µs/op | Nicht unterstützt |

| Extraktion aller Arrays | 7,136 µs/op | 2,431 µs/op | Nicht unterstützt |

Neu in 10.4.5: Massenextraktion aller Skalarwerte und Arrays – eine Funktion, die wplake/typed nicht bietet.

Wichtige architektonische Änderungen

  • Unveränderliches CommonValue: Die Klasse ist nun unveränderlich – nach der Zuweisung eines Standardwerts sind Mutationen nicht mehr zulässig.
  • Deterministisches pull(): Beim Extrahieren aus einem Array wird stets das erste Element zurückgegeben – damit entfällt nichtdeterministisches Verhalten.
  • Vereinfachte API: Hilfsklassen wurden entfernt; die Logik wurde in einen einzigen, kohärenten Ablauf integriert.

Die Abwärtskompatibilität ist formal durch den Major-Version-Sprung (8.4.1 → 10.4.5) gebrochen, doch die öffentliche API blieb unverändert. Bestehender Client-Code benötigt keinerlei Anpassungen.

Neue Methoden & Funktionen

Komplette Liste der kettenfähigen Methoden:

  • pull(string $key) – extrahiert ein geschachteltes Element anhand des Schlüssels
  • pull() – extrahiert das erste Array-Element (deterministisch)
  • get(string $key) – ruft einen Wert ab und prüft gleichzeitig dessen Vorhandensein
  • default(mixed $fallback) – legt einen Fallback-Wert für fehlende Werte fest
  • str() – wandelt den Wert in einen String um
  • isReal() – prüft, ob ein Wert tatsächlich vorhanden ist

Beispiel für komplexe Nutzung beim Verarbeiten von API-Antworten mit instabiler Struktur.

Warum das wichtig ist

  • 4-mal schnellere Ausführung gegenüber dem Baseline-Wert; nur noch doppelt so langsam wie der aktuelle Marktführer.
  • Erhält die Lesbarkeit durch Methoden-Chaining – keine fehleranfälligen Pfad-Zeichenketten mehr.
  • Bietet exklusive Features: Massenextraktion von Skalaren und Arrays.
  • Unveränderlichkeit und Determinismus steigern Zuverlässigkeit und Testbarkeit.
  • Ideal für Entwickler mittlerer bis höherer Erfahrungsstufe: Kombiniert Typsicherheit mit Produktionsreife Performance.

— Editorial Team

Advertisement 728x90

Weiterlesen