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:
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) |
|-------------|----------------|----------------|------------------------|
| 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 |
| 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
CommonValueinmutable: 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 clavepull()— extrae el primer elemento de un array (determinista)get(string $key)— recupera un valor con verificación de existenciadefault(mixed $fallback)— establece un valor por omisión para claves ausentesstr()— convierte a cadenaisReal()— 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
Aún no hay comentarios.