Loader.php 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. namespace daswork;
  3. class Loader
  4. {
  5. // protected static $instance = [];
  6. // 类名映射
  7. // protected static $map = [];
  8. // 命名空间别名
  9. // protected static $namespaces = [];
  10. // 自动加载的文件
  11. // private static $autoloadFiles = [];
  12. // 命名空间与路径映射
  13. private static $namespaces = [];
  14. // 已加载过的class
  15. protected static $classMap = [];
  16. // 自动加载
  17. private static function autoload($class)
  18. {
  19. // 是否有加载过
  20. if (in_array($class, self::$classMap)) {
  21. return true;
  22. }
  23. if ($file = self::findFile($class)) {
  24. // Win环境严格区分大小写
  25. if (IS_WIN && pathinfo($file, PATHINFO_FILENAME) != pathinfo(realpath($file), PATHINFO_FILENAME)) {
  26. return false;
  27. }
  28. __include_file($file);
  29. $classMap[] = $class;
  30. return true;
  31. }
  32. }
  33. public static function findFile($class)
  34. {
  35. // $namespace = \dirname($class); linux dirname 不能处理 '\' 用替换查找来解决
  36. $baseClass = strrchr($class, '\\');
  37. $namespace = str_replace($baseClass, '', $class);
  38. // 有命名空间映射的
  39. if (isset(self::$namespaces[$namespace])) {
  40. $file = self::$namespaces[$namespace] . $baseClass . EXT;
  41. return str_replace('\\', '/', $file);
  42. }
  43. $model = substr($class,0,strpos($class, '\\'));
  44. // var_dump($model);
  45. if ($model=='app') {
  46. $file = APP_PATH . DS. str_replace('\\', DS, substr($class,strpos($class, '\\') + 1)) . EXT;
  47. // var_dump($file);
  48. return $file;
  49. }
  50. }
  51. // 注册系统自动加载
  52. public static function register($autoload = '')
  53. {
  54. spl_autoload_register($autoload ?: 'daswork\\Loader::autoload', true, true);
  55. self::$namespaces = [
  56. 'daswork' => CORE_PATH,
  57. 'daswork\db' => CORE_PATH . 'db' . DS
  58. ];
  59. }
  60. }
  61. /**
  62. * 作用范围隔离
  63. *
  64. * @param $file
  65. * @return mixed
  66. */
  67. function __include_file($file)
  68. {
  69. return include $file;
  70. }
  71. function __require_file($file)
  72. {
  73. return require $file;
  74. }