Loader.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <?php
  2. namespace daswork;
  3. class Loader
  4. {
  5. // protected static $instance = [];
  6. // 类名映射
  7. protected static $map = [];
  8. // 命名空间别名
  9. protected static $namespaceAilas = [];
  10. // // 自动加载的文件
  11. // private static $autoloadFiles = [];
  12. // 命名空间与路径映射
  13. private static $namespaces = [];
  14. // 保存已加载的类
  15. private static $classMaps = [];
  16. // // 自动加载
  17. // public static function autoload($class)
  18. // {
  19. // // 检测命名空间别名
  20. // if (!empty(self::$namespaces)) {
  21. // $namespace = dirname($class);
  22. // if (isset(self::$namespaces[$namespace])) {
  23. // $original = self::$namespaces[$namespace] . '\\' . basename($class);
  24. // if (class_exists($original)) {
  25. // return class_alias($original, $class, false);
  26. // }
  27. // }
  28. // }
  29. // if ($file = self::findFile($class)) {
  30. // // Win环境严格区分大小写
  31. // if (IS_WIN && pathinfo($file, PATHINFO_FILENAME) != pathinfo(realpath($file), PATHINFO_FILENAME)) {
  32. // return false;
  33. // }
  34. // __include_file($file);
  35. // return true;
  36. // }
  37. // }
  38. private static function autoload($class)
  39. {
  40. if (in_array($class, self::$classMaps)) {
  41. return true;
  42. }
  43. if ($file = self::findFile($class)) {
  44. // Win环境严格区分大小写
  45. if (IS_WIN && pathinfo($file, PATHINFO_FILENAME) != pathinfo(realpath($file), PATHINFO_FILENAME)) {
  46. return false;
  47. }
  48. __include_file($file);
  49. self::$classMaps[] = $class;
  50. return true;
  51. }
  52. }
  53. public static function findFile($class)
  54. {
  55. if (IS_WIN) {
  56. $namespace = \dirname($class);
  57. // 有命名空间映射的
  58. if (isset(self::$namespaces[$namespace])) {
  59. $file = self::$namespaces[$namespace] . basename($class) . EXT;
  60. // var_dump($file);
  61. return $file;
  62. }
  63. // var_dump(substr($class,strpos($class, '\\') + 1));
  64. $model = substr($class, 0, strpos($class, '\\'));
  65. if ($model=='app') {
  66. $file = APP_PATH . DS. str_replace('\\', DS, substr($class, strpos($class, '\\') + 1)) . EXT;
  67. return $file;
  68. }
  69. } else {
  70. $class = str_replace('\\', '/', $class);
  71. $namespace = str_replace('/','\\',dirname($class));
  72. // 有命名空间映射的
  73. if (isset(self::$namespaces[$namespace])) {
  74. $file = self::$namespaces[$namespace] . basename($class) . EXT;
  75. return $file;
  76. }
  77. $model = substr($class, 0, strpos($class, '/'));
  78. if ($model=='app') {
  79. $file = APP_PATH . str_replace($model, '', $class) . EXT;
  80. // var_dump($class);
  81. return $file;
  82. }
  83. }
  84. }
  85. // 注册系统自动加载
  86. public static function register($autoload = '')
  87. {
  88. spl_autoload_register($autoload ?: 'daswork\\Loader::autoload', true, true);
  89. self::$namespaces = [
  90. 'daswork' => CORE_PATH,
  91. 'daswork\lib' => CORE_PATH . 'lib' . DS
  92. ];
  93. }
  94. }
  95. /**
  96. * 作用范围隔离
  97. *
  98. * @param $file
  99. * @return mixed
  100. */
  101. function __include_file($file)
  102. {
  103. return include $file;
  104. }
  105. function __require_file($file)
  106. {
  107. return require $file;
  108. }