donatj / php-dnf-solver
PHP DNF (析取范式) 签名兼容性求解器
Requires
- php: ^8.1.0 || ^8.2.0 || ^8.3.0
Requires (Dev)
- corpus/coding-standard: ~0.8.0
- donatj/drop: ^1.1
- donatj/mddoc: ^0.10.0
- friendsofphp/php-cs-fixer: ^3.16
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10
- slevomat/coding-standard: ^8.11
- squizlabs/php_codesniffer: ^3.7
This package is auto-updated.
Last update: 2024-09-17 18:13:20 UTC
README
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 类型中类型的数量