donatj/php-dnf-solver

PHP DNF (析取范式) 签名兼容性求解器

v0.3.0 2024-04-17 17:11 UTC

README

Latest Stable Version License ci.yml Coverage Status

PHP DNF (析取范式) 签名兼容性求解器 - 查看: https://wiki.php.net/rfc/dnf_types

需求

  • php: ^8.1.0 || ^8.2.0 || ^8.3.0

安装

使用以下命令安装最新版本:

composer require 'donatj/php-dnf-solver'

示例

示例参数满足检查

<?php

namespace Examples;

use donatj\PhpDnfSolver\DNF;
use donatj\PhpDnfSolver\Types\UserDefinedType;

require __DIR__ . '/../vendor/autoload.php';

interface A {}
interface B {}
interface C {}
interface D {}

class Foo implements A, B {}
class Bar implements B, C {}
class Baz implements C, D {}

$qux = function ( A|(B&C) $aOrB ) : void {};

$quxParamType = (new \ReflectionFunction($qux))->getParameters()[0]->getType();

$quxDnf = DNF::getFromReflectionType($quxParamType);

var_dump($quxDnf->isSatisfiedBy(
	new UserDefinedType(Foo::class)
)); // true

var_dump($quxDnf->isSatisfiedBy(
	new UserDefinedType(Bar::class)
)); // true

var_dump($quxDnf->isSatisfiedBy(
	new UserDefinedType(Baz::class)
)); // false

输出

bool(true)
bool(true)
bool(false)

示例 DNF 构建

<?php

namespace Examples;

use donatj\PhpDnfSolver\Types\AndClause;
use donatj\PhpDnfSolver\Types\BuiltInType;
use donatj\PhpDnfSolver\Types\OrClause;
use donatj\PhpDnfSolver\Types\UserDefinedType;

require __DIR__ . '/../vendor/autoload.php';

interface A {}
interface B {}
interface C {}

var_dump((new OrClause(
	new UserDefinedType(A::class),
	new UserDefinedType(B::class),
	new UserDefinedType(C::class)
))->dnf()); // A|B|C

var_dump((new OrClause(
	new UserDefinedType(A::class),
	new AndClause(
		new UserDefinedType(B::class),
		new UserDefinedType(C::class)
	)
))->dnf()); // A|(B&C)

var_dump((new OrClause(
	new AndClause(new UserDefinedType(A::class), new UserDefinedType(B::class)),
	new AndClause(
		new UserDefinedType(B::class),
		new UserDefinedType(C::class)
	),
	new BuiltInType('null'),
))->dnf()); // (A&B)|(B&C)|null

输出

string(32) "Examples\A|Examples\B|Examples\C"
string(34) "Examples\A|(Examples\B&Examples\C)"
string(52) "(Examples\A&Examples\B)|(Examples\B&Examples\C)|null"

文档

类:\donatj\PhpDnfSolver\DNF

方法:DNF::getFromReflectionType

function getFromReflectionType(\ReflectionType $type) : \donatj\PhpDnfSolver\SingularDnfTypeInterface|\donatj\PhpDnfSolver\NestedDnfTypeInterface

将 ReflectionType 转换为其 DNF 表示的辅助函数

示例来源包括
  • ReflectionFunctionAbstract::getParameters()[…]->getType()
  • ReflectionParameter::getType()
  • ReflectionMethod::getReturnType()
  • ReflectionProperty::getType()

方法:DNF::reflectionTypeSatisfiesReflectionType

function reflectionTypeSatisfiesReflectionType(\ReflectionType $satisfyingType, \ReflectionType $satisfiedType) : bool

快速检查一个 ReflectionType 是否满足另一个 ReflectionType 的辅助函数

参数
  • \ReflectionType $satisfyingType - 必须满足的类型(例如参数类型)
  • \ReflectionType $satisfiedType - 必须满足其他类型的类型(例如返回类型)

方法:DNF::getFromVarType

function getFromVarType(\ReflectionParameter|\ReflectionProperty $parameter) : \donatj\PhpDnfSolver\SingularDnfTypeInterface|\donatj\PhpDnfSolver\NestedDnfTypeInterface|null

快速获取(ReflectionParameter 或 ReflectionProperty)返回类型的 DNF 表示的辅助函数

方法:DNF::getFromReturnType

function getFromReturnType(\ReflectionFunctionAbstract $func) : \donatj\PhpDnfSolver\SingularDnfTypeInterface|\donatj\PhpDnfSolver\NestedDnfTypeInterface|null

快速获取 ReflectionFunctionAbstract (ReflectionFunction /
ReflectionMethod) 返回类型的 DNF 表示的辅助函数

类:\donatj\PhpDnfSolver\Exceptions\InvalidArgumentException

类:\donatj\PhpDnfSolver\Exceptions\LogicException

类:\donatj\PhpDnfSolver\Types\AndClause

表示一个 "and 子句" - 必须满足的所有类型的集合 - 例如 "A& B & C"

方法:AndClause->__construct

function __construct(\donatj\PhpDnfSolver\SingularDnfTypeInterface ...$types)
参数
  • \donatj\PhpDnfSolver\SingularDnfTypeInterface $types - 要满足的类型列表

方法:AndClause->dnf

function dnf() : string

返回此类型的 DNF 表示的规范字符串表示形式

方法:AndClause->isSatisfiedBy

function isSatisfiedBy(\donatj\PhpDnfSolver\SingularDnfTypeInterface|\donatj\PhpDnfSolver\NestedDnfTypeInterface $value) : bool

测试此类型是否被给定的类型满足

例如,如果此类型是 "A | (B & C)",并且给定的类型只匹配 "A",则此方法返回 true。
如果给定的类型只匹配 "B",则此方法返回 false。
如果给定的类型匹配 "B & C",则此方法返回 true。

方法:AndClause->count

function count() : int

返回此 DNF 类型中类型的数量

方法:AndClause->getTypes

function getTypes() : array
返回
  • \donatj\PhpDnfSolver\SingularDnfTypeInterface[]

类:\donatj\PhpDnfSolver\Types\BuiltInType

表示由 ReflectionNamedType::isBuiltin() 定义的 "内置类型"

这包括

  • int
  • float
  • string
  • bool
  • array
  • iterable

方法:BuiltInType->__construct

function __construct(string $name)
参数
  • string $name - 内置类型的名称

方法:BuiltInType->dnf

function dnf() : string

返回此类型的 DNF 表示的规范字符串表示形式

方法:BuiltInType->getTypeName

function getTypeName() : string

返回此类型的完全限定类型名称

方法:BuiltInType->isSatisfiedBy

function isSatisfiedBy(\donatj\PhpDnfSolver\SingularDnfTypeInterface|\donatj\PhpDnfSolver\NestedDnfTypeInterface $value) : bool

测试此类型是否被给定的类型满足

例如,如果此类型是 "A | (B & C)",并且给定的类型只匹配 "A",则此方法返回 true。
如果给定的类型只匹配 "B",则此方法返回 false。
如果给定的类型匹配 "B & C",则此方法返回 true。

方法:BuiltInType->count

function count() : int

对于单例类型始终为 1

返回此 DNF 类型中类型的数量

类:\donatj\PhpDnfSolver\Types\CallableType

表示 "callable" 类型

这包括

  • callable
  • Closure
  • 可调用的类

方法:CallableType->dnf

function dnf() : string

返回此类型的 DNF 表示的规范字符串表示形式

方法:CallableType->isSatisfiedBy

function isSatisfiedBy(\donatj\PhpDnfSolver\SingularDnfTypeInterface|\donatj\PhpDnfSolver\NestedDnfTypeInterface $value) : bool

测试此类型是否被给定的类型满足

例如,如果此类型是 "A | (B & C)",并且给定的类型只匹配 "A",则此方法返回 true。
如果给定的类型只匹配 "B",则此方法返回 false。
如果给定的类型匹配 "B & C",则此方法返回 true。

方法:CallableType->getTypeName

function getTypeName() : string

返回此类型的完全限定类型名称

方法:CallableType->count

function count() : int

对于单例类型始终为 1

返回此 DNF 类型中类型的数量

类:\donatj\PhpDnfSolver\Types\OrClause

表示“或”子句 - 一组必须满足的类型集合 - 例如:“A|B|(C&D)”

方法:OrClause->__construct

function __construct(\donatj\PhpDnfSolver\Types\AndClause|\donatj\PhpDnfSolver\SingularDnfTypeInterface ...$types)
参数
  • \donatj\PhpDnfSolver\Types\AndClause | \donatj\PhpDnfSolver\SingularDnfTypeInterface $types - 需要满足的类型列表。不接受OrClause,因为DNF将其视为无效。

方法:OrClause->dnf

function dnf() : string

返回此类型的 DNF 表示的规范字符串表示形式

方法:OrClause->isSatisfiedBy

function isSatisfiedBy(\donatj\PhpDnfSolver\SingularDnfTypeInterface|\donatj\PhpDnfSolver\NestedDnfTypeInterface $value) : bool

测试此类型是否被给定的类型满足

例如,如果此类型是 "A | (B & C)",并且给定的类型只匹配 "A",则此方法返回 true。
如果给定的类型只匹配 "B",则此方法返回 false。
如果给定的类型匹配 "B & C",则此方法返回 true。

方法:OrClause->count

function count() : int

返回此 DNF 类型中类型的数量

方法:OrClause->getTypes

function getTypes() : array
返回
  • \donatj\PhpDnfSolver\Types\AndClause[]

类:\donatj\PhpDnfSolver\Types\UserDefinedType

表示“用户定义类型” - 一个类、接口、特性等。

<?php
namespace donatj\PhpDnfSolver\Types;

class UserDefinedType {
	public $className;
}

方法:UserDefinedType->__construct

function __construct(string $className)
参数
  • class-string $className - 需要满足的类、接口或特性的名称

抛出: \donatj\PhpDnfSolver\Exceptions\InvalidArgumentException - 如果在触发已注册的自动加载器后用户定义的类型不存在

方法:UserDefinedType->dnf

function dnf() : string

返回此类型的 DNF 表示的规范字符串表示形式

方法:UserDefinedType->getTypeName

function getTypeName() : string

返回此类型的完全限定类型名称

返回
  • class-string

方法:UserDefinedType->isSatisfiedBy

function isSatisfiedBy(\donatj\PhpDnfSolver\SingularDnfTypeInterface|\donatj\PhpDnfSolver\NestedDnfTypeInterface $value) : bool

测试此类型是否被给定的类型满足

例如,如果此类型是 "A | (B & C)",并且给定的类型只匹配 "A",则此方法返回 true。
如果给定的类型只匹配 "B",则此方法返回 false。
如果给定的类型匹配 "B & C",则此方法返回 true。

方法:UserDefinedType->count

function count() : int

对于单例类型始终为 1

返回此 DNF 类型中类型的数量