es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Closure/Decorator en PHP?

Quiero enlazar una función a otra función para cachear sus resultados.
Desafortunadamente no es una clase, por lo que creo que no puedo usar Closures.

Es decir, como un decorador en Python.

Quiero hacer esto porque no puedo modificar la función parcheando un código de API.

Entonces tengo una función que se llama muy a menudo y siempre hace una consulta SQL:

function api_func() {
    global $wpdb;
    // ... hacer una consulta sin caché ...
    return $wpdb->get_col(...);
}

Quiero rodear esta función con otra función cache_func(), de modo que cada vez que se llame a api_func(), se llame a cache_func() y pueda cachear los resultados una vez.

¿Alguna idea?

Gracias

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr esto es utilizar una función de orden superior en PHP. Aquí tienes un ejemplo:

    function cache_func($func) {
        $cache = []; // crear una caché para almacenar resultados previos
        return function() use ($func, &$cache) {
            $args = func_get_args();
            $key = md5(serialize($args)); // generar una clave única basada en los argumentos
            if (!array_key_exists($key, $cache)) {
                $cache[$key] = call_user_func_array($func, $args); // llamar a la función original y almacenar el resultado en la caché
            }
            return $cache[$key];
        };
    }
    
    function api_func() {
        global $wpdb;
        // ... realizar una consulta sin caché ...
        return $wpdb->get_col(...);
    }
    
    $cached_api_func = cache_func('api_func'); // envolver api_func con cache_func
    
    // ahora puedes usar $cached_api_func en lugar de api_func, y se almacenará en caché
    

    En este ejemplo, cache_func toma una función como argumento y devuelve una nueva función que almacena en caché los resultados de la función original. Los resultados en caché se almacenan en un arreglo asociativo ($cache), utilizando una clave única generada en función de los argumentos de la función. Cuando se llama a la función en caché, primero verifica si el resultado ya está en la caché y, de ser así, lo devuelve de inmediato. Si no está en caché, llama a la función original y almacena el resultado en la caché.

    Para utilizar este enfoque en tu caso, simplemente llama a cache_func con api_func como argumento, y luego utiliza la función resultante ($cached_api_func) en lugar de api_func.

Comments are closed.