1<?php declare(strict_types = 1);
3namespace DaveRandom\CallbackValidator;
10 private function __construct() { }
16 private static $builtInTypes = [
17 BuiltInTypes::STRING =>
true,
18 BuiltInTypes::INT =>
true,
19 BuiltInTypes::FLOAT =>
true,
20 BuiltInTypes::BOOL =>
true,
21 BuiltInTypes::ARRAY =>
true,
22 BuiltInTypes::CALLABLE =>
true,
23 BuiltInTypes::VOID =>
true,
24 BuiltInTypes::ITERABLE =>
true,
31 private static $scalarTypes = [
32 BuiltInTypes::STRING =>
true,
33 BuiltInTypes::INT =>
true,
34 BuiltInTypes::FLOAT =>
true,
35 BuiltInTypes::BOOL =>
true,
46 if (!isset(self::$scalarTypes[$superTypeName])) {
51 if (isset(self::$scalarTypes[$subTypeName])) {
56 if ($superTypeName === BuiltInTypes::STRING && \method_exists($subTypeName,
'__toString')) {
71 public static function isMatch($superTypeName, $superTypeNullable, $subTypeName, $subTypeNullable, $weak)
74 if ($superTypeName ===
null) {
79 if ($subTypeName ===
null) {
83 $superTypeName = (string)$superTypeName;
84 $subTypeName = (string)$subTypeName;
87 if ($subTypeNullable && !$superTypeNullable) {
89 return $superTypeName === BuiltInTypes::VOID && $subTypeName === BuiltInTypes::VOID;
93 if ($superTypeName === $subTypeName) {
98 if ($superTypeName === BuiltInTypes::ITERABLE) {
99 return $subTypeName === BuiltInTypes::ARRAY
100 || $subTypeName === \Traversable::class
101 || \is_subclass_of($subTypeName, \Traversable::class);
105 if ($superTypeName === BuiltInTypes::CALLABLE) {
106 return $subTypeName === \Closure::class
107 || \method_exists($subTypeName,
'__invoke')
108 || \is_subclass_of($subTypeName, \Closure::class);
112 if (isset(self::$builtInTypes[$superTypeName])) {
118 if (isset(self::$builtInTypes[$subTypeName])) {
122 return \is_subclass_of($subTypeName, $superTypeName);
static isMatch($superTypeName, $superTypeNullable, $subTypeName, $subTypeNullable, $weak)
static isWeakScalarMatch($superTypeName, $subTypeName)