| @@ -1,5 +1,5 @@ | ||
| 1 | -<?php | |
| 1 | +<?php declare(strict_types=1); | |
| 2 | 2 | |
| 3 | 3 | namespace Invoker; |
| 4 | 4 | |
| 5 | 5 | use Invoker\Exception\NotCallableException; |
| @@ -10,32 +10,25 @@ | ||
| 10 | 10 | use Invoker\ParameterResolver\ParameterResolver; |
| 11 | 11 | use Invoker\ParameterResolver\ResolverChain; |
| 12 | 12 | use Invoker\Reflection\CallableReflection; |
| 13 | 13 | use Psr\Container\ContainerInterface; |
| 14 | +use ReflectionParameter; | |
| 14 | 15 | |
| 15 | 16 | /** |
| 16 | 17 | * Invoke a callable. |
| 17 | - * | |
| 18 | - * @author Matthieu Napoli <matthieu@mnapoli.fr> | |
| 19 | 18 | */ |
| 20 | 19 | class Invoker implements InvokerInterface |
| 21 | 20 | { |
| 22 | - /** | |
| 23 | - * @var CallableResolver|null | |
| 24 | - */ | |
| 21 | + /** @var CallableResolver|null */ | |
| 25 | 22 | private $callableResolver; |
| 26 | 23 | |
| 27 | - /** | |
| 28 | - * @var ParameterResolver | |
| 29 | - */ | |
| 24 | + /** @var ParameterResolver */ | |
| 30 | 25 | private $parameterResolver; |
| 31 | 26 | |
| 32 | - /** | |
| 33 | - * @var ContainerInterface|null | |
| 34 | - */ | |
| 27 | + /** @var ContainerInterface|null */ | |
| 35 | 28 | private $container; |
| 36 | 29 | |
| 37 | - public function __construct(ParameterResolver $parameterResolver = null, ContainerInterface $container = null) | |
| 30 | + public function __construct(?ParameterResolver $parameterResolver = null, ?ContainerInterface $container = null) | |
| 38 | 31 | { |
| 39 | 32 | $this->parameterResolver = $parameterResolver ?: $this->createParameterResolver(); |
| 40 | 33 | $this->container = $container; |
| 41 | 34 | |
| @@ -46,9 +39,9 @@ | ||
| 46 | 39 | |
| 47 | 40 | /** |
| 48 | 41 | * {@inheritdoc} |
| 49 | 42 | */ |
| 50 | - public function call($callable, array $parameters = array()) | |
| 43 | + public function call($callable, array $parameters = []) | |
| 51 | 44 | { |
| 52 | 45 | if ($this->callableResolver) { |
| 53 | 46 | $callable = $this->callableResolver->resolve($callable); |
| 54 | 47 | } |
| @@ -61,9 +54,9 @@ | ||
| 61 | 54 | } |
| 62 | 55 | |
| 63 | 56 | $callableReflection = CallableReflection::create($callable); |
| 64 | 57 | |
| 65 | - $args = $this->parameterResolver->getParameters($callableReflection, $parameters, array()); | |
| 58 | + $args = $this->parameterResolver->getParameters($callableReflection, $parameters, []); | |
| 66 | 59 | |
| 67 | 60 | // Sort by array key because call_user_func_array ignores numeric keys |
| 68 | 61 | ksort($args); |
| 69 | 62 | |
| @@ -68,11 +61,10 @@ | ||
| 68 | 61 | ksort($args); |
| 69 | 62 | |
| 70 | 63 | // Check all parameters are resolved |
| 71 | 64 | $diff = array_diff_key($callableReflection->getParameters(), $args); |
| 72 | - if (! empty($diff)) { | |
| 73 | - /** @var \ReflectionParameter $parameter */ | |
| 74 | - $parameter = reset($diff); | |
| 65 | + $parameter = reset($diff); | |
| 66 | + if ($parameter && \assert($parameter instanceof ReflectionParameter) && ! $parameter->isVariadic()) { | |
| 75 | 67 | throw new NotEnoughParametersException(sprintf( |
| 76 | 68 | 'Unable to invoke the callable because no value was given for parameter %d ($%s)', |
| 77 | 69 | $parameter->getPosition() + 1, |
| 78 | 70 | $parameter->name |
| @@ -83,32 +75,27 @@ | ||
| 83 | 75 | } |
| 84 | 76 | |
| 85 | 77 | /** |
| 86 | 78 | * Create the default parameter resolver. |
| 87 | - * | |
| 88 | - * @return ParameterResolver | |
| 89 | 79 | */ |
| 90 | - private function createParameterResolver() | |
| 80 | + private function createParameterResolver(): ParameterResolver | |
| 91 | 81 | { |
| 92 | - return new ResolverChain(array( | |
| 82 | + return new ResolverChain([ | |
| 93 | 83 | new NumericArrayResolver, |
| 94 | 84 | new AssociativeArrayResolver, |
| 95 | 85 | new DefaultValueResolver, |
| 96 | - )); | |
| 86 | + ]); | |
| 97 | 87 | } |
| 98 | 88 | |
| 99 | 89 | /** |
| 100 | 90 | * @return ParameterResolver By default it's a ResolverChain |
| 101 | 91 | */ |
| 102 | - public function getParameterResolver() | |
| 92 | + public function getParameterResolver(): ParameterResolver | |
| 103 | 93 | { |
| 104 | 94 | return $this->parameterResolver; |
| 105 | 95 | } |
| 106 | 96 | |
| 107 | - /** | |
| 108 | - * @return ContainerInterface|null | |
| 109 | - */ | |
| 110 | - public function getContainer() | |
| 97 | + public function getContainer(): ?ContainerInterface | |
| 111 | 98 | { |
| 112 | 99 | return $this->container; |
| 113 | 100 | } |
| 114 | 101 | |
| @@ -114,9 +101,9 @@ | ||
| 114 | 101 | |
| 115 | 102 | /** |
| 116 | 103 | * @return CallableResolver|null Returns null if no container was given in the constructor. |
| 117 | 104 | */ |
| 118 | - public function getCallableResolver() | |
| 105 | + public function getCallableResolver(): ?CallableResolver | |
| 119 | 106 | { |
| 120 | 107 | return $this->callableResolver; |
| 121 | 108 | } |
| 122 | 109 | } |