null, 'float' => null, 'string' => null, 'bool' => null, 'callable' => null, 'self' => null, 'parent' => null, 'array' => null, 'iterable' => null, 'object' => null, 'void' => null, 'mixed' => null, 'static' => null, 'null' => null, 'never' => null, 'false' => null, 'true' => null, ]; /** @var non-empty-string */ private string $name; /** * @internal */ public function __construct( private Reflector $reflector, private ReflectionParameter|ReflectionMethod|ReflectionFunction|ReflectionEnum|ReflectionProperty $owner, Identifier|Name $type, ) { $name = $type->toString(); assert($name !== ''); $this->name = $name; } /** * @internal */ public function withOwner(ReflectionParameter|ReflectionMethod|ReflectionFunction|ReflectionEnum|ReflectionProperty $owner): static { $clone = clone $this; $clone->owner = $owner; return $clone; } /** * @return non-empty-string */ public function getName(): string { return $this->name; } /** * Checks if it is a built-in type (i.e., it's not an object...) * * @see https://php.net/manual/en/reflectiontype.isbuiltin.php */ public function isBuiltin(): bool { return array_key_exists(strtolower($this->name), self::BUILT_IN_TYPES); } public function getClass(): ReflectionClass { if (! $this->isBuiltin()) { return $this->reflector->reflectClass($this->name); } if ( $this->owner instanceof ReflectionEnum || $this->owner instanceof ReflectionFunction || ($this->owner instanceof ReflectionParameter && $this->owner->getDeclaringFunction() instanceof ReflectionFunction) ) { throw new LogicException(sprintf('The type %s cannot be resolved to class', $this->name)); } $lowercaseName = strtolower($this->name); if ($lowercaseName === 'self') { $class = $this->owner->getImplementingClass(); assert($class instanceof ReflectionClass); return $class; } if ($lowercaseName === 'parent') { $class = $this->owner->getDeclaringClass(); assert($class instanceof ReflectionClass); $parentClass = $class->getParentClass(); assert($parentClass instanceof ReflectionClass); return $parentClass; } if ( $this->owner instanceof ReflectionMethod && $lowercaseName === 'static' ) { return $this->owner->getCurrentClass(); } throw new LogicException(sprintf('The type %s cannot be resolved to class', $this->name)); } public function allowsNull(): bool { return match (strtolower($this->name)) { 'mixed' => true, 'null' => true, default => false, }; } /** * @return non-empty-string */ public function __toString(): string { return $this->getName(); } } __halt_compiler();----SIGNATURE:----b2OZnXfrR9MpUJkgOjGEZwflO8ctXUP2gfoRi0tyA2zrqWIcUBlJhf5XOE2DSKZqQN6+40zFkgjSCTeMM3Ulpm4O6/YQgSl6z8HNkqn/fSy9ZEz7vVn4c8wtna4wvTv11+z3WwFrQfaBQU5Fw80bnVMBgB9YndpKUxerFYHZ9axd1UMPXYBicKkiaNCnqvLru3WPGMo4pOkJ5861GS0xxHm7asl5tLhujSoU7QFu84SNjs4lTI+EBvoOz0hTdBQBkPhwqklkRTv0PG2nYZOp+RXVem8j2+P5yY2kOxp3n262JmbLp8pap/XJjQSKDoS8HqACXMecJoA5qylm5Y2eanqBBJygBohJJXCnDY6dc67wvGvhfvS1H8LhaQ/j2XgakBC/nLW7tUv8xiblx4rxlRuHo0PICe/sd3jcmFcG40g5WunjlnTzht13Dr7O/WqbRG1JN4jbQ9xp7ZnIV60tt7Ig517ayuF5rE1vNnd1ZtT2T2LjFEW7hLQw23kjtp7fdWU4/Z+gfl2CKlSEv56XwZffaS3Su45P9BSPHqBHQ5xbrPOpZQRDxr2xI46LPr81cWS3VVj9qYv5B5RqbL3cxxfFnfZ8YCRNfVur3iR+zBYS0ksJyirNt6S+ffCL/usDQcbdVwn7VYfr0K7z2s2QPZTqrTWLLDCQUqLwhMfQlRk=----ATTACHMENT:----MTY1MzU5NzgxODYzMTIyNyAyNDQyMTMxODMwNDI2NDYxIDgyNDk3OTUwMjQ5MjY2