Volver al inicio

Matrices PHP con seguridad de tipos: +4x velocidad

El artículo analiza optimizaciones de la biblioteca sbwerewolf/language-specific: aceleración 4x, comparación con wplake/typed. Benchmarks, ejemplos de código de API encadenable y nuevas características como inmutabilidad se proporcionan.

PHP: matrices con seguridad de tipos 4 veces más rápidas
Advertisement 728x90

Arrays tipados en PHP: aceleración de 4× sin sacrificar legibilidad

La biblioteca sbwerewolf/language-specific versión 10.4.5 logra una mejora de rendimiento de 4× frente a la versión 8.4.1. Su brecha respecto a wplake/typed (1.2.2) se ha reducido a solo 2×. La primera utiliza rutas basadas en cadenas; la segunda depende del encadenamiento de métodos para navegar estructuras de datos anidadas.

Ejemplo con 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';

// valor con valor por omisión
$val = Typed::string($object, $path, 'Dirección no encontrada');
var_dump($val);
/*
string(77)
"1, Mohammed Bin Rashid Boulevard, Downtown Dubai, Dubai, Emiratos Árabes Unidos"
*/

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

Funcionalidad equivalente en 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("Dirección no encontrada");
$val = $formatted->str();
var_dump($val);
/* 
string(77)
"1, Mohammed Bin Rashid Boulevard, Downtown Dubai, Dubai, Emiratos Árabes Unidos"
*/
$isReal = $formatted->isReal();
var_dump($isReal);
/* bool(true) */

Pruebas de rendimiento

Las pruebas reflejan casos reales: análisis de JSON en escenarios óptimos, manejo de rutas inexistentes, verificación de existencia de elementos, coerción de tipos y recuperación directa de valores.

| Caso de uso | 8.4.1 (antes) | 10.4.5 (después) | 1.2.2 (wplake/typed) |

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

Google AdInline article slot

| Análisis JSON en caso óptimo | 29,210 µs/op | 6,467 µs/op | 3,013 µs/op |

| Análisis JSON con ruta inexistente | 18,716 µs/op | 5,987 µs/op | 1,766 µs/op |

| Verificación de existencia de elemento | 27,237 µs/op | 6,277 µs/op | 2,863 µs/op |

Google AdInline article slot

| Coerción de tipo de valor | 28,581 µs/op | 6,740 µs/op | 2,966 µs/op |

| Recuperación directa de valor | 30,395 µs/op | 6,558 µs/op | 3,015 µs/op |

| Extracción masiva de valores escalares | 5,897 µs/op | 1,878 µs/op | No soportado |

| Extracción masiva de arrays | 7,136 µs/op | 2,431 µs/op | No soportado |

Novedad en la 10.4.5: extracción masiva de todos los valores escalares y arrays — funcionalidad ausente en wplake/typed.

Cambios arquitectónicos clave

  • CommonValue inmutable: la clase ya no permite modificaciones tras asignar el valor por omisión.
  • pull() determinista: al extraer de un array, siempre devuelve el primer elemento, eliminando comportamientos no deterministas.
  • API simplificada: clases auxiliares eliminadas; la lógica se concentra en un flujo único y coherente.

La compatibilidad hacia atrás se rompe formalmente por el salto de versión mayor (8.4.1 → 10.4.5), pero la API pública permanece idéntica. El código cliente no requiere modificaciones.

Nuevos métodos y capacidades

Lista completa de métodos encadenables:

  • pull(string $key) — extrae un elemento anidado por clave
  • pull() — extrae el primer elemento de un array (determinista)
  • get(string $key) — recupera un valor con verificación de existencia
  • default(mixed $fallback) — establece un valor por omisión para claves ausentes
  • str() — convierte a cadena
  • isReal() — verifica si el valor está presente

Ejemplo de uso avanzado para procesar respuestas de APIs con estructura inestable.

Por qué es relevante

  • Aceleración de 4× frente a la versión base; solo 2× más lento que el líder actual.
  • Mantiene la legibilidad del encadenamiento de métodos — sin rutas frágiles basadas en cadenas.
  • Incorpora funciones únicas: recolección masiva de escalares y arrays.
  • Inmutabilidad y determinismo mejoran fiabilidad y capacidad de prueba.
  • Ideal para ingenieros intermedios y senior: combina seguridad de tipos con rendimiento listo para producción.

— Editorial Team

Advertisement 728x90

Leer después