一个简单的PHP trait,用于缓存函数调用。

v1.0.3 2023-02-15 21:48 UTC

This package is auto-updated.

Last update: 2024-09-08 06:07:15 UTC


README

Latest Version on Packagist Tests Check & fix styling License

简介

此软件包为您提供简单的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。请参阅许可证文件以获取更多信息。