Facade.php 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. namespace think;
  12. /**
  13. * Facade管理类
  14. */
  15. class Facade
  16. {
  17. /**
  18. * 始终创建新的对象实例
  19. * @var bool
  20. */
  21. protected static $alwaysNewInstance;
  22. /**
  23. * 创建Facade实例
  24. * @static
  25. * @access protected
  26. * @param string $class 类名或标识
  27. * @param array $args 变量
  28. * @param bool $newInstance 是否每次创建新的实例
  29. * @return object
  30. */
  31. protected static function createFacade(string $class = '', array $args = [], bool $newInstance = false)
  32. {
  33. $class = $class ?: static::class;
  34. $facadeClass = static::getFacadeClass();
  35. if ($facadeClass) {
  36. $class = $facadeClass;
  37. }
  38. if (static::$alwaysNewInstance) {
  39. $newInstance = true;
  40. }
  41. return Container::getInstance()->make($class, $args, $newInstance);
  42. }
  43. /**
  44. * 获取当前Facade对应类名
  45. * @access protected
  46. * @return string
  47. */
  48. protected static function getFacadeClass()
  49. {}
  50. /**
  51. * 带参数实例化当前Facade类
  52. * @access public
  53. * @return object
  54. */
  55. public static function instance(...$args)
  56. {
  57. if (__CLASS__ != static::class) {
  58. return self::createFacade('', $args);
  59. }
  60. }
  61. /**
  62. * 调用类的实例
  63. * @access public
  64. * @param string $class 类名或者标识
  65. * @param array|true $args 变量
  66. * @param bool $newInstance 是否每次创建新的实例
  67. * @return object
  68. */
  69. public static function make(string $class, $args = [], $newInstance = false)
  70. {
  71. if (__CLASS__ != static::class) {
  72. return self::__callStatic('make', func_get_args());
  73. }
  74. if (true === $args) {
  75. // 总是创建新的实例化对象
  76. $newInstance = true;
  77. $args = [];
  78. }
  79. return self::createFacade($class, $args, $newInstance);
  80. }
  81. // 调用实际类的方法
  82. public static function __callStatic($method, $params)
  83. {
  84. return call_user_func_array([static::createFacade(), $method], $params);
  85. }
  86. }