47 if (!isset(self::$scalarTypes[$superTypeName])) {
52 if (isset(self::$scalarTypes[$subTypeName])) {
57 if ($superTypeName === BuiltInTypes::STRING && \method_exists($subTypeName,
'__toString')) {
72 public static function isMatch($superTypeName, $superTypeNullable, $subTypeName, $subTypeNullable, $weak)
75 if ($superTypeName ===
null) {
80 if ($subTypeName ===
null) {
84 $superTypeName = (string)$superTypeName;
85 $subTypeName = (string)$subTypeName;
88 if ($subTypeNullable && !$superTypeNullable) {
90 return $superTypeName === BuiltInTypes::VOID && $subTypeName === BuiltInTypes::VOID;
94 if ($superTypeName === $subTypeName) {
99 if ($superTypeName === BuiltInTypes::ITERABLE) {
100 return $subTypeName === BuiltInTypes::ARRAY
101 || $subTypeName === \Traversable::class
102 || \is_subclass_of($subTypeName, \Traversable::class);
106 if ($superTypeName === BuiltInTypes::CALLABLE) {
107 return $subTypeName === \Closure::class
108 || \method_exists($subTypeName,
'__invoke')
109 || \is_subclass_of($subTypeName, \Closure::class);
112 if ($superTypeName === BuiltInTypes::OBJECT) {
113 return class_exists($subTypeName) || interface_exists($subTypeName);
117 if (isset(self::$builtInTypes[$superTypeName])) {
123 if (isset(self::$builtInTypes[$subTypeName])) {
127 return \is_subclass_of($subTypeName, $superTypeName);