Import.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. namespace Qii\Autoloader;
  3. class Import
  4. {
  5. const VERSION = '1.3';
  6. private static $loadedFiles = array();
  7. private static $includeFiles = array();
  8. /**
  9. * require文件
  10. *
  11. * @param string $file 需要require的文件
  12. * @return array|bool|void
  13. */
  14. public static function requires($file)
  15. {
  16. if (is_array($file)) {
  17. return array_map(function ($n) {
  18. return self::requires($n);
  19. }, $file);
  20. }
  21. $file = str_replace(DS . DS , DS, str_replace(array('\\', '/'), DS, $file));
  22. if (self::getFileLoaded($file)) return true;
  23. if (file_exists($file)) {
  24. self::setFileLoaded($file);
  25. require $file;
  26. return true;
  27. }
  28. return false;
  29. }
  30. /**
  31. * 包含文件
  32. * @param string $file 文件路径
  33. * @return mix
  34. */
  35. public static function includes($file)
  36. {
  37. if (is_array($file)) {
  38. return array_map(function ($n) {
  39. return self::includes($n);
  40. }, $file);
  41. }
  42. $file = str_replace(array('\\', '/'), DS, $file);
  43. if (self::getIncludeFiles($file) !== null) self::getIncludeFiles($file);
  44. if (file_exists($file)) {
  45. $configure = include($file);
  46. self::setIncludeFiles($file, $configure);
  47. return $configure;
  48. }
  49. return false;
  50. }
  51. /**
  52. * 根据类名载入文件
  53. *
  54. * @param string $className 类名
  55. * @return string
  56. */
  57. public static function requireByClass($className)
  58. {
  59. return \Qii\Autoloader\Psr4::getInstance()->loadFileByClass($className);
  60. }
  61. /**
  62. * 载入文件夹中所有文件
  63. *
  64. * @param string $dir 目录
  65. * @throws Qii\Exceptions\FileNotFound
  66. */
  67. public static function requireByDir($dir)
  68. {
  69. if (!is_dir($dir)) throw new \Qii\Exceptions\FileNotFound(\Qii::i(1405, $dir), __LINE__);
  70. $files = self::findFiles($dir, array('php'));
  71. if (isset($files['php'])) self::requires($files['php']);
  72. }
  73. /**
  74. * 设置文件到加载列表
  75. *
  76. * @param string $file 文件
  77. */
  78. public static function setFileLoaded($file)
  79. {
  80. self::$loadedFiles[$file] = true;
  81. }
  82. /**
  83. * 获取指定文件是否已经加载
  84. * @param string $file 文件路径
  85. * @return null
  86. */
  87. public static function getFileLoaded($file)
  88. {
  89. if (isset(self::$loadedFiles[$file])) return self::$loadedFiles[$file];
  90. return false;
  91. }
  92. /**
  93. * 设置include的文件到已经加载列表
  94. *
  95. * @param string $file 文件路径
  96. */
  97. public static function setIncludeFiles($file, $config)
  98. {
  99. self::$includeFiles[$file] = $config;
  100. }
  101. /**
  102. * 获取指定文件是否已经加载
  103. *
  104. * @param string $file 文件路径
  105. * @return bool
  106. */
  107. public static function getIncludeFiles($file)
  108. {
  109. if (isset(self::$includeFiles[$file])) {
  110. return self::$includeFiles[$file];
  111. }
  112. return false;
  113. }
  114. /**
  115. * 获取已经require及include的文件列表
  116. *
  117. * @return array
  118. */
  119. public static function getLoadedFile()
  120. {
  121. return array('include' => self::$includeFiles, 'requires' => self::$loadedFiles);
  122. }
  123. /**
  124. * 遍历目录中的路径
  125. * @param string $directory 目录
  126. * @param array $directories 目录下所有的路径
  127. */
  128. public static function globRecursive($directory, &$directories = array())
  129. {
  130. foreach (glob($directory, GLOB_ONLYDIR | GLOB_NOSORT) as $folder) {
  131. $directories[] = $folder;
  132. self::globRecursive("{$folder}/*", $directories);
  133. }
  134. }
  135. /**
  136. * 返回指定目录中的文件
  137. * @param string $directory 目录
  138. * @param array $extensions 需要过滤的后缀名
  139. * @return array
  140. */
  141. public static function findFiles($directory, $extensions = array())
  142. {
  143. self::globRecursive($directory, $directories);
  144. $files = array();
  145. foreach ($directories as $directory) {
  146. if (count($extensions) == 0) {
  147. foreach (glob("{$directory}/*.*") as $file) {
  148. $files[] = $file;
  149. }
  150. } else {
  151. foreach ($extensions as $extension) {
  152. foreach (glob("{$directory}/*.{$extension}") as $file) {
  153. $files[$extension][] = $file;
  154. }
  155. }
  156. }
  157. }
  158. return $files;
  159. }
  160. }