En el desarrollo web, manejar bien la memoria puede marcar la diferencia en el rendimiento de una aplicación. En PHP, hay una estructura de datos que suele pasar desapercibida pero que resulta útil para este propósito: el WeakMap.
En este artículo explico qué es un WeakMap, cómo se diferencia de un array común y en qué situaciones conviene usarlo.
¿Qué es un WeakMap?:
Un WeakMap en PHP es una estructura de datos que nos permite asociar pares de llaves y valores, pero con una característica única: maneja las llaves como referencias débiles. Esto significa que si la única referencia a una llave está dentro del WeakMap, la llave será eliminada automáticamente de la memoria cuando ya no se utilice en ningún otro lugar del código.
Diferencias con un Array Normal:
La principal diferencia entre un WeakMap y un array normal radica en cómo manejan las referencias a las llaves. Mientras que un array normal mantiene las llaves en memoria incluso si ya no se utilizan en ningún otro lugar del código, un WeakMap elimina automáticamente las llaves de la memoria cuando ya no son necesarias, lo que ayuda a optimizar el uso de memoria en nuestra aplicación.
Ejemplo Práctico:
<?php
$weakMap = new WeakMap();
$objetoLlave = new stdClass();
$weakMap[$objetoLlave] = "Valor asociado";
echo $weakMap[$objetoLlave] . "\n";
unset($objetoLlave);
echo "La llave ya no existe en el WeakMap\n";
Al ejecutarlo me da los siguientes resultados:
Valor asociado
La llave ya no existe en el WeakMap
Ahorro de Memoria:
Para ilustrar cómo un WeakMap puede ayudar a optimizar el uso de memoria, comparemos el uso de memoria entre un WeakMap y un array normal en un escenario donde necesitamos asociar objetos con valores en grandes cantidades.
Ejemplo Práctico:
<?php
$sizeBefore = memory_get_usage();
$weakMap = new WeakMap();
for ($i = 0; $i < 100000; $i++) {
$objeto = new stdClass();
$weakMap[$objeto] = $i;
}
$sizeAfter = memory_get_usage();
echo "Uso de memoria con WeakMap: " . ($sizeAfter - $sizeBefore) . " bytes\n";
$sizeBefore = memory_get_usage();
$array = [];
for ($i = 0; $i < 100000; $i++) {
$array[$i] = $i;
}
$sizeAfter = memory_get_usage();
echo "Uso de memoria con array normal: " . ($sizeAfter - $sizeBefore) . " bytes\n";
Al ejecutarlo me da los siguientes resultados:
Uso de memoria con WeakMap: 776 bytes
Uso de memoria con array normal: 2113616 bytes
Estos resultados pueden variar según las características del equipo donde sea ejecutado.
En resumen
Un WeakMap en PHP permite asociar datos a objetos sin impedir que el garbage collector los libere cuando ya no se necesitan. Esto lo hace útil en escenarios donde se trabaja con muchos objetos temporales, ya que evita el crecimiento innecesario del uso de memoria que sí ocurre con un array normal.
