eclipxe /micro-catalog
微型目录模板类,用于根据已知的小目录创建值对象
Requires
- php: >=7.2
Requires (Dev)
- phpunit/phpunit: ^8.5
README
微型目录PHP模板类,用于根据已知的小目录创建值对象。
我多次需要目录,例如,在收到结果代码并关联到特定相关值时。这个库帮助我解决了这个常见问题,也许它也能帮助你。
安装
使用composer,使用以下命令安装:
composer require eclipxe/micro-catalog
用法
MicroCatalog
是一个模板类,因此您需要扩展它才能使用它。严格来说,您只需实现两个抽象方法:getEntriesArray(): array
和getEntryValueOnUndefined(): mixed
。
糖存在于is<Type>(): bool
和get<Property>(): bool
中,特殊情况为isUndefined(): bool
。`is<Type>()
`方法允许通过索引区分类型。《code>get<Property>()`方法允许在内容存在时从值数组中获取字符串键。
请参阅以下示例
ResultCodes
常规用法,值作为scalar
,允许未定义的属性。ComplexArray
常规用法,值作为array
,获取属性,允许未定义的属性。ComplexObject
常规用法,值作为object
,获取属性,禁用未定义的属性。
MicroCatalog
示例
<?php declare(strict_types=1); use Eclipxe\MicroCatalog\MicroCatalog; /** * ResultCodes is an example class to show the basic usage * * @method bool isOk() * @method bool isWarning() * @method bool isError() */ final class ResultCodes extends MicroCatalog { public static function getEntriesArray(): array { return [ 0 => 'Ok', 1 => 'Warning', 2 => 'Error', ]; } public function getEntryValueOnUndefined(): string { return '#N/A'; } public function getEntryId(): string { return strval($this->getEntryValue()); } } $warning = new ResultCodes(1); var_dump($warning->isWarning()); // bool(true) var_dump($warning->getEntryIndex()); // int(1) var_dump($warning->getEntryValue()); // string(7) "Warning" var_dump($warning->getEntryId()); // string(7) "Warning" (method was overriden) var_dump($warning->isUndefined()); // bool(false) $other = new ResultCodes(99); var_dump($other->isUndefined()); // bool(true) var_dump($other->getEntryIndex()); // int(99) var_dump($other->getEntryValue()); // string(4) "#N/A"
未定义条目
当创建MicroCatalog
实例时,如果键在已知值列表中找不到,它将使用getValueOnUndefined()
中的值。
如果您不想允许未知实例,可以在getValueOnUndefined()
上重写并抛出异常。
检查实例是否为特定条目
使用方法is<name>()
进行比较。
默认情况下,当索引是字符串时,它将按默认方式工作,例如:isFoo()
将评估当前索引是否为foo
(第一个字符为小写)。
您可以通过重写getEntryId(): string
函数来重新定义这种行为。因此,isFoo()
将比较foo
与getEntryId(): string
返回的值。
您必须在您的docblock中定义这些方法,以便您的IDE或代码分析器检测到您正在做什么。
获取一个神奇属性
如果您的已知值数组包含具有字符串键的数组或具有公共变量的标准对象,则getSomething()
将返回在something
键/属性上定义的内容。
即使PHP支持具有不同大小写的函数,此类也使用精确的大小写,因此getSomething()
与getSomeThing()
不同。对键/属性名称进行查找时进行的唯一转换是将第一个字符转换为小写,然后getSomething()
将查找本地值中的something
。无论如何,您可以通过重写方法getEntryValueWithKey(string $key): mixed
来对键/属性名称执行其他转换。
扩展
我建议您将您的MicroCatalog
类声明为final
以禁用扩展。
在创建扩展自其他类的 MicroCatalog
时,父 MicroCatalog
在索引和值方面具有优先权。您不能覆盖先前类的索引或值。
异常
此包抛出的异常实现了空接口 Eclipxe\MicroCatalog\Exceptions\MicroCatalogException
。
创建型模式
您可以编写其他创建型模式,实现的构造函数使用值作为索引条目。如果您想根据某些值或其他类型的评估创建条目,我不建议您重写构造函数,相反,您可以使用静态方法调用。
PHP 支持
此库与至少具有 活跃 支持的最老版本的 PHP 支持版本 兼容。请尽量使用 PHP 的全部潜能。
我们遵循 语义版本控制。在主版本上,我们不会引入任何向后不兼容的更改。
内部类(使用 @internal
注解)不属于此协议,因为它们只存在于本项目内部。请不要在您的项目中使用它们。
贡献
欢迎贡献!请阅读 CONTRIBUTING 以获取详细信息,并不要忘记查看 TODO 和 CHANGELOG 文件。
版权和许可
eclipxe/micro-catalog
库的版权©归 Carlos C Soto 所有,并许可在 MIT 许可证(MIT)下使用。请参阅 LICENSE 以获取更多信息。