Una pequeña función de memoria en PHP

Una pequeña función de memoria en PHP — Amit Merchant — Un blog sobre PHP, JavaScript y más

Entonces, Caleb Porzio compartió recientemente una pequeña función de memorización en PHP. Lo que hace la función es bastante simple.

Almacena en caché el resultado de una llamada de función y devuelve el resultado almacenado en caché si se vuelve a llamar a la función con los mismos argumentos.

Aquí está la función.

function memoize($target) 
{
    static $memo = new WeakMap;

    return new class ($target, $memo) {
        function __construct(
            protected $target,
            protected &$memo,
        ) {}

        function __call($method, $params)
        {
            $this->memo[$this->target] ??= [];

            $signature = $method . crc32(json_encode($params));

            return $this->memo[$this->target][$signature]
               ??= $this->target->$method(...$params);
        }
    };
}

Y así es como puedes usarlo.

class User 
{
    private function getViewCount()
    {
        return DB::table('users')->count();
    }
}

$user = new User;

// saves the result of the first call
$viewCount = memoize($user)->getViewCount(); 

// returns the cached result
$viewCountAgain = memoize($user)->getViewCount(); 

Como puede ver, la función toma un objeto de destino como primer argumento y devuelve una nueva instancia de clase en la que puede llamar a los métodos del objeto de destino.

Esencialmente, la función crea una nueva instancia de clase y aprovecha la __call() método mágico para llamar al método en el objeto de destino. Luego almacena en caché el resultado de la llamada al método y devuelve el resultado almacenado en caché si el método se vuelve a llamar con los mismos argumentos.

Él utiliza WeakMap para almacenar en caché el resultado de la llamada al método. Esto se debe al hecho WeakMap no contiene una referencia a la clave. Así, cuando ya no se referencia la clave, se borrará del mapa y se liberará la memoria.

Una pequeña característica bastante intrigante, ¿no?

Si quieres conocer otros artículos parecidos a Una pequeña función de memoria en PHP puedes visitar la categoría Código.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Esta página web utiliza cookies para analizar de forma anónima y estadística el uso que haces de la web, mejorar los contenidos y tu experiencia de navegación. Para más información accede a la Política de Cookies . Ver mas