ReflectorItem.class.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. /* vim: set expandtab sw=4 ts=4 sts=4: */
  3. /**
  4. * Holds the PMA\DI\ReflectorItem class
  5. *
  6. * @package PMA
  7. */
  8. namespace PMA\DI;
  9. require_once 'libraries/di/Item.int.php';
  10. /**
  11. * Reflector manager
  12. *
  13. * @package PMA\DI
  14. */
  15. abstract class ReflectorItem implements Item
  16. {
  17. /** @var Container */
  18. private $_container;
  19. /** @var \Reflector */
  20. private $_reflector;
  21. /**
  22. * Constructor
  23. *
  24. * @param Container $container Container
  25. * @param mixed $definition Definition
  26. */
  27. public function __construct(Container $container, $definition)
  28. {
  29. $this->_container = $container;
  30. $this->_reflector = self::_resolveReflector($definition);
  31. }
  32. /**
  33. * Invoke the reflector with given parameters
  34. *
  35. * @param array $params Parameters
  36. * @return mixed
  37. */
  38. protected function invoke($params = array())
  39. {
  40. $args = array();
  41. $reflector = $this->_reflector;
  42. if ($reflector instanceof \ReflectionClass) {
  43. $constructor = $reflector->getConstructor();
  44. if (isset($constructor)) {
  45. $args = $this->_resolveArgs(
  46. $constructor->getParameters(),
  47. $params
  48. );
  49. }
  50. return $reflector->newInstanceArgs($args);
  51. }
  52. /** @var \ReflectionFunctionAbstract $reflector */
  53. $args = $this->_resolveArgs(
  54. $reflector->getParameters(),
  55. $params
  56. );
  57. if ($reflector instanceof \ReflectionMethod) {
  58. /** @var \ReflectionMethod $reflector */
  59. return $reflector->invokeArgs(null, $args);
  60. }
  61. /** @var \ReflectionFunction $reflector */
  62. return $reflector->invokeArgs($args);
  63. }
  64. /**
  65. * Getting required arguments with given parameters
  66. *
  67. * @param \ReflectionParameter[] $required Arguments
  68. * @param array $params Parameters
  69. *
  70. *@return array
  71. */
  72. private function _resolveArgs($required, $params = array())
  73. {
  74. $args = array();
  75. foreach ($required as $param) {
  76. $name = $param->getName();
  77. $type = $param->getClass();
  78. if (isset($type)) {
  79. $type = $type->getName();
  80. }
  81. if (isset($params[$name])) {
  82. $args[] = $params[$name];
  83. } elseif (is_string($type) && isset($params[$type])) {
  84. $args[] = $params[$type];
  85. } else {
  86. $content = $this->_container->get($name);
  87. if (isset($content)) {
  88. $args[] = $content;
  89. } elseif (is_string($type)) {
  90. $args[] = $this->_container->get($type);
  91. } else {
  92. $args[] = null;
  93. }
  94. }
  95. }
  96. return $args;
  97. }
  98. /**
  99. * Resolve the reflection
  100. *
  101. * @param mixed $definition Definition
  102. *
  103. * @return \Reflector
  104. */
  105. private static function _resolveReflector($definition)
  106. {
  107. if (function_exists($definition)) {
  108. return new \ReflectionFunction($definition);
  109. }
  110. if (is_string($definition)) {
  111. $definition = explode('::', $definition);
  112. }
  113. if (!isset($definition[1])) {
  114. return new \ReflectionClass($definition[0]);
  115. }
  116. return new \ReflectionMethod($definition[0], $definition[1]);
  117. }
  118. }