wildphp/type-definitions

此包已被废弃,不再维护。未建议替代包。

类型定义和验证库

安装: 203

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 0

开放问题: 0

类型:项目

0.1 2021-05-16 12:03 UTC

This package is auto-updated.

Last update: 2023-08-27 15:01:24 UTC


README

Code analysis Latest Stable Version Latest Unstable Version Total Downloads

提供类型验证和表达式的库。包括一个解释器,可以将简短、简洁的语法转换为可用的类型。

安装

为了使用此库,请通过 Composer 安装

$ composer require wildphp/type-definitions

使用类进行类型定义

可以使用此库中的类构建类型定义。有3个主要类

  • PrimitiveTypeDefinition
  • ClassTypeDefinition
  • ArrayTypeDefinition

PrimitiveTypeDefinition

原始类型定义是指那些指向标量或内置类型的类型。 PrimitiveTypeDefinitiongettype() 的包装。

例如

$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'