编程教育资源分享平台

网站首页 > 后端开发 正文

七爪源码:如何在 PHP 中创建一个简单的 memoization 助手

luoriw 2024-02-01 14:22:42 后端开发 10 ℃ 0 评论

首先,什么是memoization? 来自维基百科

在计算中,记忆化或记忆化是一种优化技术,主要用于通过存储昂贵的函数调用的结果并在再次出现相同的输入时返回缓存的结果来加速计算机程序。

每当我们调用具有相同参数的函数时,它将返回缓存的结果而不是重新计算。

就我而言,我想保持简单,而不是每次都检查函数参数。 我将根据传递给 memoization 助手的键缓存结果。 这是一个简单的实现

<?phpnamespace App\Helpers\Core\Traits;trait Memoization
{
    protected static $memoized = [];    public function memoize(
      string $key, 
      \Closure $callback
    ) {
        if (!isset(static::$memoized[$key])) {
            return static::$memoized[$key] = $callback();
        }
        return static::$memoized[$key];
    }
}

代码本身是不言自明的。 首先,我们声明了一个带有空数组的静态类型属性作为值来存储执行函数的缓存结果。 在我们的 memoize 函数中,我们检查密钥是否存在于我们的 $memoized 静态属性中。 如果没有,我们运行回调函数,将其存储到传递的键中的 $momoized 属性中,然后返回值。 如果它确实存在,那么我们返回已经缓存的结果。

用法:

$this->memoize('a_static_key_to_store_value', function () {
    //Do your things 
});

那么问题来了:如果函数的参数发生变化,你将如何处理? 而不是使用静态键来缓存函数结果,答案很简单:使用基于函数参数的唯一键。例如,我想从数据库中获取用户定义的设置,它将在多个地方使用。 因此,不要只传递 `settings` 作为键,而是传递 `”settings-$user_id”`

$this->memoize("settings-$user_id", function () use($user_id) {
    //Get the value from database using $user_id
    //Parse it the way you need it
});


For more content like this. Make sure to follow me.

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表
最新留言