diff --git a/src/SignatureAssertionUtil.php b/src/SignatureAssertionUtil.php index 4a7f4e8976f9426bfb3bbad5f06c65adb5c72654..e468c8a0ccca85240660d09ce7ec9cf62a54660b 100644 --- a/src/SignatureAssertionUtil.php +++ b/src/SignatureAssertionUtil.php @@ -11,21 +11,29 @@ final class SignatureAssertionUtil { } - public static function checkSignature(callable $function, array $parameters, ?string $expectedReturnType): void { $reflection = new \ReflectionFunction($function); // NUMBER OF PARAMETERS CHECK: + self::checkParameters($parameters, $reflection); + + // RETURN TYPE: + self::checkReturnType($expectedReturnType, $reflection); + } + + // parameters: + private static function checkParameters(array $parameters, \ReflectionFunction $reflection): void + { $numberOfParameters = $reflection->getNumberOfParameters(); - if($numberOfParameters !== count($parameters)) { + if ($numberOfParameters !== count($parameters)) { throw FunctionSignatureAssertionError::wrongNumberOrArguments($reflection, count($parameters), $numberOfParameters); } // PARAMETER TYPES CHECK: $i = 0; /** @var string[] $parameters */ - foreach($parameters AS $parameter) { + foreach ($parameters AS $parameter) { assert(is_string($parameter)); $parameterReflection = $reflection->getParameters()[$i++]; @@ -37,46 +45,6 @@ final class SignatureAssertionUtil ...self::parseType($parameter) ); } - - - // RETURN TYPE: - if($expectedReturnType !== NULL) { - if(!$reflection->hasReturnType()) { - throw FunctionSignatureAssertionError::missingReturnType($reflection, $expectedReturnType); - } - - if ($reflection->hasReturnType()) { - list($expectedReturnType, $expectingNullable) = self::parseType($expectedReturnType); - $returnTypeReflection = $reflection->getReturnType(); - - $actuallyNullable = $returnTypeReflection->allowsNull(); - if ($expectingNullable !== $actuallyNullable) { - throw FunctionSignatureAssertionError::wrongReturnTypeNullability( - $reflection, - $expectingNullable, - $actuallyNullable - ); - } - if ($expectedReturnType !== (string) $reflection->getReturnType()) { - throw FunctionSignatureAssertionError::wrongReturnType( - $reflection, - $expectedReturnType, - (string) $reflection->getReturnType() - ); - } - } - } - } - - private static function parseType(string $type): array - { - $cleanType = $type; // e.g. ?Namespace\Class - $nullable = FALSE; - if ($type[0] === '?') { - $nullable = TRUE; - $cleanType = substr($type, 1); // without leading '?' - } - return [$cleanType, $nullable]; } private static function checkFunctionParameter( @@ -109,4 +77,48 @@ final class SignatureAssertionUtil } } + // Return-type: + private static function checkReturnType(?string $expectedReturnType, \ReflectionFunction $reflection): void + { + if ($expectedReturnType === NULL) { + return; + } + + if (!$reflection->hasReturnType()) { + throw FunctionSignatureAssertionError::missingReturnType($reflection, $expectedReturnType); + } + + [$expectedReturnType, $expectingNullable] = self::parseType($expectedReturnType); + $returnTypeReflection = $reflection->getReturnType(); + + $actuallyNullable = $returnTypeReflection->allowsNull(); + if ($expectingNullable !== $actuallyNullable) { + throw FunctionSignatureAssertionError::wrongReturnTypeNullability( + $reflection, + $expectingNullable, + $actuallyNullable + ); + } + if ($expectedReturnType !== (string) $reflection->getReturnType()) { + throw FunctionSignatureAssertionError::wrongReturnType( + $reflection, + $expectedReturnType, + (string) $reflection->getReturnType() + ); + } + } + + // helpers: + + private static function parseType(string $type): array + { + $cleanType = $type; // e.g. ?Namespace\Class + $nullable = FALSE; + if ($type[0] === '?') { + $nullable = TRUE; + $cleanType = substr($type, 1); // without leading '?' + } + return [$cleanType, $nullable]; + } + }