wildphp / type-definitions
此包已被废弃,不再维护。未建议替代包。
类型定义和验证库
0.1
2021-05-16 12:03 UTC
Requires
- php: ^7.2|^8.0
Requires (Dev)
- phpmd/phpmd: ^2.9.1
- phpstan/phpstan: ^0.12.84
- phpunit/phpunit: ^8.5
- squizlabs/php_codesniffer: ^3.6.0
README
提供类型验证和表达式的库。包括一个解释器,可以将简短、简洁的语法转换为可用的类型。
安装
为了使用此库,请通过 Composer 安装
$ composer require wildphp/type-definitions
使用类进行类型定义
可以使用此库中的类构建类型定义。有3个主要类
PrimitiveTypeDefinition
ClassTypeDefinition
ArrayTypeDefinition
PrimitiveTypeDefinition
原始类型定义是指那些指向标量或内置类型的类型。 PrimitiveTypeDefinition
是 gettype() 的包装。
例如
$definition = new \WildPHP\TypeDefinitions\PrimitiveTypeDefinition('string'); echo $definition->validate('this is a valid string'); // true echo $definition->validate(1); // false echo $definition->validate(false); // false
或者,也可以使用 PrimitiveTypeDefinition
类上的某个常量来指定类型。这些映射到 gettype()
的类型说明符,并建议使用它们来代替手动指定类型。
$definition = new \WildPHP\TypeDefinitions\PrimitiveTypeDefinition(\WildPHP\TypeDefinitions\PrimitiveTypeDefinition::STRING);
ClassTypeDefinition
类类型定义使用 instanceof 来验证它们的值。这意味着任何类,只要它是给定类的实例或继承者,都会通过此定义。
null
也被视为有效值。
例如
$definition = new \WildPHP\TypeDefinitions\ClassTypeDefinition(stdClass::class); $object = new stdClass(); echo $definition->validate($object); // true echo $definition->validate(null); // true echo $definition->validate('this is a string'); // false echo $definition->validate(1); // false echo $definition->validate(false); // false
ArrayTypeDefinition
数组类型定义使用子类型定义(内容定义)来验证它们的值。这使得编写复杂的嵌套结构成为可能。
请注意,ArrayTypeDefinition
仅验证值,不验证键。键验证没有太多意义,因为 PHP 本身限制了键类型为字符串和整数。
如果任何子类不符合内容定义,验证将失败。
例如
$childDefinition = new \WildPHP\TypeDefinitions\PrimitiveTypeDefinition('string'); $definition = new \WildPHP\TypeDefinitions\ArrayTypeDefinition($childDefinition); echo $definition->validate(['this is a valid string', 'another valid string']); // true echo $definition->validate(1); // false echo $definition->validate([1]); // false echo $definition->validate(false); // false echo $definition->validate([false]); // false echo $definition->validate(['this is a string', 1]); // false, because 1 does not conform
使用映射和字符串进行类型定义
库提供了一个 TypeDefinitionInterpreter
辅助类,用于将映射和字符串转换为 TypeDefinitionInterface
实例。
这被用于 models library 中,以提供快速模型声明和验证。
createDefinitionMap
用于将基于键值数组的值转换为 TypeDefinitionInterface 实现。此方法将保留键,并且不会修改现有数组。
例如
$map = [ 'array' => ['string'], 'string' => 'string', 'stdClass' => stdClass::class ]; $interpreted = \WildPHP\TypeDefinitions\TypeDefinitionInterpreter::createDefinitionMap($map); // $interpreted['array'] is now an instance of ArrayTypeDefinition with a content definition of PrimitiveTypeDefinition with type 'string' // $interpreted['string'] is now an instance of PrimitiveTypeDefinition with type 'string' // $interpreted['stdClass'] is now an instance of ClassTypeDefinition with class identifier stdClass::class
如果你不需要解释映射,而是需要解释单个值,请使用 interpret
函数
$definition = 'string'; $interpreted = \WildPHP\TypeDefinitions\TypeDefinitionInterpreter::interpret($definition); // $interpreted is now an instance of PrimitiveTypeDefinition with type 'string'