celestriode/dynamic-registry

简单、按需填充的独立注册表,节省内存。

v3.0.0 2021-12-22 17:12 UTC

This package is auto-updated.

Last update: 2024-09-22 23:03:03 UTC


README

创建按需填充的注册表,而不是在它们从未被访问时浪费内存。

示例

扩展

为每个您想要保存一组值的注册表类型扩展 AbstractRegistry

class ItemsRegistry extends AbstractRegistry
{
    public function getName() : string
    {
        return 'items';
    }
}

class EntitiesRegistry extends AbstractRegistry
{
    protected $defaultValues = [1, 2, 3]; // Optional.

    public function getName() : string
    {
        return 'entities';
    }
}

或者,如果您只想在注册表中使用字符串,可以扩展 AbstractStringRegistry。当向此类注册表添加非字符串值时,将抛出 InvalidValue

class ItemsRegistry extends AbstractStringRegistry
{
    public function getName() : string
    {
        return 'items';
    }
}

或者,如果您只想有一个简单的容器且不需要多个唯一的注册表,可以创建一个新的 SimpleRegistry 对象。

$registry = new SimpleRegistry(-1, -2, -3); // Optionally add values upon instantiation.

用法

您可以使用 new 创建一个用于注册表的新对象,或者通过 get() 获取单例。

$itemsRegistry = ItemsRegistry::get();
$entitiesRegistry = EntitiesRegistry::get(4, 5, 6); // Optionally add values upon FIRST get() call.

除了最初存在的值之外,您还可以创建并注册一个动态填充器。动态填充器在第一次通过 has() 查询注册表或通过 populate() 强制填充注册表时添加值。

class ItemsPopulator implements DynamicPopulatorInterface
{
    public function populate(AbstractRegistry $registry) : void
    {
        $registry->addValues('a', 'b', 'c');
    }
}

当然,您不会使用硬编码的值来动态填充,而是通过其他方式填充注册表,例如从数据库或通过外部 API。注册填充器后,一旦调用 has(),注册表将被自动填充,并且如果存在值,将返回 true。

$itemsRegistry->has('a'); // false
$itemsRegistry->register(new ItemsPopulator());
$itemsRegistry->has('a'); // true

请注意,尝试添加多个相同的值会导致抛出 InvalidValue。为了防止这种结果,并使其静默失败,请重写 failSilently 方法。

class ItemsRegistry extends AbstractStringRegistry
{
    public function getName() : string
    {
        return 'items';
    }
    
    public function failSilently(): bool
    {
        return true;
    }
}