laracraft-tech / memoize
一个简单的PHP trait,用于缓存函数调用。
Requires
- php: ^8.1
- spatie/once: ^3.1
- symfony/var-dumper: ^6.2
Requires (Dev)
- laravel/pint: ^1.2
- pestphp/pest: ^1.20
README
简介
此软件包为您提供简单的PHP trait,它可以为您的类添加高性能的记忆化!
安装
$ composer require laracraft-tech/memoize
用法
memoize
方法接受一个 callable
。
use LaracraftTech\Memoize\HasMemoization; $myClass = new class() { use HasMemoization; public function getNumber(): int { return $this->memoize(function () { return rand(1, 10000); }); } };
无论您多少次运行 $myClass->getNumber()
,您总是会得到相同的数字。
memoize
方法只会对 闭包 收到的 use
变量的 一次组合 运行。
$myClass = new class() { use HasMemoization; public function getNumberForLetter($letter) { return $this->memoize(function () use ($letter) { return $letter . rand(1, 10000000); }); } }
所以调用 $myClass->getNumberForLetter('A')
总是会返回相同的结果,但调用 $myClass->getNumberForLetter('B')
将返回不同的结果。
一些记忆化软件包使用包含方法的参数来实现 一次组合 的想法。我们认为这感觉有点不直观,并且在某些情况下会影响性能。所以我们使用闭包的 use
变量作为 一次组合 键。作为后备,如果您喜欢/需要,我们还可以让您在闭包的第二个可选参数中完全自定义 一次组合 键。
use LaracraftTech\Memoize\HasMemoization; $myClass = new class() { use HasMemoization; public function processSomethingHeavy1($someModel) { // ... $relation = $this->memoize(function () use ($someModel) { return Foo::find($someModel->foo_relation_id); }, $someModel->foo_relation_id); // <--- custom once per combination key // ... } // you could also do something like this (maybe more convinient) public function processSomethingHeavy2($someModel) { // ... $foo_relation_id = $someModel->foo_relation_id; $relation = $this->memoize(function () use ($foo_relation_id) { return Foo::find($foo_relation_id); }); // ... } // this would work but will lose performance on each new $someModel even foo_relation_id would be the same public function processSomethingHeavy3($someModel) { // ... $relation = $this->memoize(function () use ($someModel) { return Foo::find($someModel->foo_relation_id); }); // ... } }
所以当调用 $myClass->processSomethingHeavy1(SomeModel::find(1))
时,变量 $relation
总是具有与 $myClass->processSomethingHeavy1(SomeModel::find(2))
相同的值,只要它们的 foo_relation_id
相同。在有些其他记忆化软件包中,您会失去性能,因为 包含方法 参数($someModel)已更改... 注意,processSomethingHeavy3
也会失去性能,即使 foo_relation_id
是相同的,因为这里也会使用更改的 $someModel 作为组合键,而这个模型至少有一个不同的id。
启用/禁用
您可以通过在您的 .env
文件中将 MEMOIZATION_GLOBALLY_DISABLED
设置为 true
来全局启用或禁用记忆化缓存。
如果您只想禁用特定类的记忆化缓存,可以这样做
use LaracraftTech\Memoize\HasMemoization; class MyClass { use HasMemoization; public function __construct() { $this->disableMemoization(); } }
变更日志
有关最近更改的更多信息,请参阅变更日志。
测试
$ composer test
贡献
有关详细信息和一个待办事项列表,请参阅contributing.md。
安全
如果您发现任何安全相关的问题,请通过电子邮件zacharias.creutznacher@gmail.com而不是使用问题跟踪器。
鸣谢
许可证
MIT。请参阅许可证文件以获取更多信息。