/** * Resolve a function call definition to a value. * * This will call the function and return its result. * * @param FunctionCallDefinition $definition * * {@inheritdoc} */ public function resolve(Definition $definition, array $parameters = array()) { $this->assertIsFunctionCallDefinition($definition); $callable = $definition->getCallable(); $functionReflection = CallableReflectionFactory::fromCallable($callable); try { $args = $this->parameterResolver->resolveParameters($definition, $functionReflection, $parameters); } catch (DefinitionException $e) { throw DefinitionException::create($definition, $e->getMessage()); } if ($functionReflection instanceof \ReflectionFunction) { return $functionReflection->invokeArgs($args); } /** @var \ReflectionMethod $functionReflection */ if ($functionReflection->isStatic()) { // Static method $object = null; } elseif (is_object($callable)) { // Callable object $object = $callable; } elseif (is_string($callable)) { // Callable class (need to be instantiated) $object = $this->container->get($callable); } elseif (is_string($callable[0])) { // Class method $object = $this->container->get($callable[0]); } else { // Object method $object = $callable[0]; } return $functionReflection->invokeArgs($object, $args); }
/** * {@inheritdoc} */ public function dump(Definition $definition) { if (!$definition instanceof FunctionCallDefinition) { throw new \InvalidArgumentException(sprintf('This definition dumper is only compatible with FunctionCallDefinition objects, %s given', get_class($definition))); } $callable = $definition->getCallable(); $functionReflection = CallableReflectionFactory::fromCallable($callable); $functionName = $this->getFunctionName($functionReflection); $parameters = $this->dumpMethodParameters($definition, $functionReflection); return sprintf("%s(\n %s\n)", $functionName, $parameters); }
/** * {@inheritdoc} * TODO use a `callable` type-hint once support is for PHP 5.4 and up */ public function getCallableDefinition($callable) { $reflection = CallableReflectionFactory::fromCallable($callable); return new FunctionCallDefinition($callable, $this->getParametersDefinition($reflection)); }