Import.php 4.7 KB

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