Tableaux typés en PHP : gain de performance jusqu’à 4× sans sacrifier la lisibilité
La bibliothèque sbwerewolf/language-specific version 10.4.5 offre un gain de performance de 4× par rapport à la version 8.4.1. L’écart avec wplake/typed (1.2.2) se réduit désormais à seulement 2×. La première utilise des chemins sous forme de chaînes ; la seconde repose sur le method chaining pour naviguer dans des structures de données imbriquées.
Exemple avec 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';
// Valeur avec valeur par défaut
$val = Typed::string($object, $path, 'Adresse introuvable');
var_dump($val);
/*
string(77)
"1, Mohammed Bin Rashid Boulevard, Downtown Dubai, Dubai, Émirats arabes unis"
*/
$isReal = Typed::stringOrNull($object, $path) !== null;
var_dump($isReal);
/* bool(true) */
Fonctionnalité équivalente avec 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 introuvable");
$val = $formatted->str();
var_dump($val);
/*
string(77)
"1, Mohammed Bin Rashid Boulevard, Downtown Dubai, Dubai, Émirats arabes unis"
*/
$isReal = $formatted->isReal();
var_dump($isReal);
/* bool(true) */
Benchmarks de performance
Les benchmarks reflètent des cas d’usage réels : analyse JSON dans des scénarios optimaux, gestion de chemins absents, vérification de l’existence d’un élément, conversion de type et récupération brute de valeurs.
| Cas d’usage | 8.4.1 (avant) | 10.4.5 (après) | 1.2.2 (wplake/typed) |
|-------------|----------------|----------------|------------------------|
| Analyse JSON (scénario nominal) | 29,210 µs/op | 6,467 µs/op | 3,013 µs/op |
| Analyse JSON (chemin absent) | 18,716 µs/op | 5,987 µs/op | 1,766 µs/op |
| Vérification d’existence | 27,237 µs/op | 6,277 µs/op | 2,863 µs/op |
| Conversion de type | 28,581 µs/op | 6,740 µs/op | 2,966 µs/op |
| Récupération brute | 30,395 µs/op | 6,558 µs/op | 3,015 µs/op |
| Extraction de toutes les valeurs scalaires | 5,897 µs/op | 1,878 µs/op | Non pris en charge |
| Extraction de tous les tableaux | 7,136 µs/op | 2,431 µs/op | Non pris en charge |
Nouveauté en 10.4.5 : extraction groupée de toutes les valeurs scalaires et de tous les tableaux — fonctionnalité absente dans wplake/typed.
Changements architecturaux clés
- Classe
CommonValueimmuable : aucune modification n’est autorisée après l’attribution de la valeur par défaut. - Méthode
pull()déterministe : lors de l’extraction depuis un tableau, retourne systématiquement le premier élément — éliminant tout comportement non déterministe. - API simplifiée : suppression des classes auxiliaires ; la logique est désormais concentrée dans un flux unique et cohérent.
La compatibilité ascendante est officiellement rompue en raison du saut de version majeure (8.4.1 → 10.4.5), mais l’API publique reste inchangée. Aucune modification n’est requise dans le code client.
Nouvelles méthodes et fonctionnalités
Liste complète des méthodes chaînables :
pull(string $key)— extraire un élément imbriqué par sa clépull()— extraire le premier élément d’un tableau (déterministe)get(string $key)— récupérer une valeur avec vérification d’existencedefault(mixed $fallback)— définir une valeur par défaut en cas d’absencestr()— convertir en chaîne de caractèresisReal()— vérifier la présence effective de la valeur
Exemple d’utilisation avancée pour traiter des réponses API dont la structure peut varier.
Pourquoi cela compte
- Gain de performance de 4× par rapport à la base de référence ; seulement 2× plus lent que le leader actuel.
- Préserve la lisibilité du method chaining — pas de chemins fragiles sous forme de chaînes.
- Ajoute des fonctionnalités uniques : collecte groupée de scalaires et de tableaux.
- L’immuabilité et le déterminisme renforcent la fiabilité et la testabilité.
- Idéal pour les ingénieurs intermédiaires ou confirmés : allie sécurité de type et performances adaptées à la production.
— Editorial Team
Aucun commentaire pour le moment.