Ioc.php 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <?php
  2. namespace Core;
  3. /**
  4. * 工具类,使用该类来实现自动依赖注入。
  5. */
  6. class Ioc {
  7. /**
  8. * 获得类的对象实例
  9. * @param $className
  10. * @return mixed
  11. */
  12. public static function getInstance($className) {
  13. $paramArr = self::getMethodParams($className);
  14. return (new \ReflectionClass($className))->newInstanceArgs($paramArr);
  15. }
  16. /**
  17. * 执行类的方法
  18. * @param [type] $className [类名]
  19. * @param [type] $methodName [方法名称]
  20. * @param [type] $params [额外的参数]
  21. * @return [type] [description]
  22. */
  23. public static function make($className, $methodName, $params = []) {
  24. // 获取类的实例
  25. $instance = self::getInstance($className);
  26. // 获取该方法所需要依赖注入的参数
  27. $paramArr = self::getMethodParams($className, $methodName);
  28. return $instance->{$methodName}(...array_merge($paramArr, $params));
  29. }
  30. /**
  31. * 获得类的方法参数,只获得有类型的参数
  32. * @param [type] $className [description]
  33. * @param [type] $methodsName [description]
  34. * @return [type] [description]
  35. */
  36. protected static function getMethodParams($className, $methodsName = '__construct') {
  37. // 通过反射获得该类
  38. $class = new \ReflectionClass($className);
  39. $paramArr = []; // 记录参数,和参数类型
  40. // 判断该类是否有构造函数
  41. if ($class->hasMethod($methodsName)) {
  42. // 获得构造函数
  43. $construct = $class->getMethod($methodsName);
  44. // 判断构造函数是否有参数
  45. $params = $construct->getParameters();
  46. if (count($params) > 0) {
  47. // 判断参数类型
  48. foreach ($params as $key => $param) {
  49. if ($paramClass = $param->getClass()) {
  50. // 获得参数类型名称
  51. $paramClassName = $paramClass->getName();
  52. // 获得参数类型
  53. $args = self::getMethodParams($paramClassName);
  54. $paramArr[] = (new \ReflectionClass($paramClass->getName()))->newInstanceArgs($args);
  55. }
  56. }
  57. }
  58. }
  59. return $paramArr;
  60. }
  61. }