首先,什么是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.