Retour à l'accueil

Tableaux PHP type-sûrs : +4x vitesse

L'article analyse les optimisations de la bibliothèque sbwerewolf/language-specific : accélération 4x, comparaison avec wplake/typed. Benchmarks, exemples de code d'API chainable, et nouvelles fonctionnalités comme l'immutabilité sont fournis.

PHP : tableaux type-sûrs 4 fois plus rapides
Advertisement 728x90

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 :

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 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) |

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

Google AdInline article slot

| 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 |

Google AdInline article slot

| 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 CommonValue immuable : 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’existence
  • default(mixed $fallback) — définir une valeur par défaut en cas d’absence
  • str() — convertir en chaîne de caractères
  • isReal() — 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

Advertisement 728x90

Lire ensuite