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:
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) |
|----------------|----------------|----------------|------------------------|
| 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 |
| 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üsselspull()– extrahiert das erste Array-Element (deterministisch)get(string $key)– ruft einen Wert ab und prüft gleichzeitig dessen Vorhandenseindefault(mixed $fallback)– legt einen Fallback-Wert für fehlende Werte feststr()– wandelt den Wert in einen String umisReal()– 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
Noch keine Kommentare.