celestriode / dynamic-registry
简单、按需填充的独立注册表,节省内存。
v3.0.0
2021-12-22 17:12 UTC
Requires
- php: ^8.0
- ext-ds: *
Requires (Dev)
- phpunit/phpunit: ^9.5
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; } }