ClosureDefinitionCollector.php 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * This file is part of Hyperf.
  5. *
  6. * @link https://www.hyperf.io
  7. * @document https://hyperf.wiki
  8. * @contact group@hyperf.io
  9. * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
  10. */
  11. namespace Hyperf\Di;
  12. use Closure;
  13. use ReflectionFunction;
  14. class ClosureDefinitionCollector extends AbstractCallableDefinitionCollector implements ClosureDefinitionCollectorInterface
  15. {
  16. protected static array $container = [];
  17. public function getParameters(Closure $closure): array
  18. {
  19. $key = spl_object_hash($closure);
  20. if (static::has($key)) {
  21. return static::get($key);
  22. }
  23. $reflectionFunction = new ReflectionFunction($closure);
  24. $parameters = $reflectionFunction->getParameters();
  25. $definitions = $this->getDefinitionsFromParameters($parameters);
  26. static::set($key, $definitions);
  27. return $definitions;
  28. }
  29. public function getReturnType(Closure $closure): ReflectionType
  30. {
  31. $key = spl_object_hash($closure) . '@return';
  32. if (static::has($key)) {
  33. return static::get($key);
  34. }
  35. $returnType = (new ReflectionFunction($closure))->getReturnType();
  36. $type = $this->createType('', $returnType, $returnType ? $returnType->allowsNull() : true);
  37. static::set($key, $type);
  38. return $type;
  39. }
  40. }